레거시 시스템 교체 및 ServiceStack + 사용자 정의 직렬화를 사용하여 새 서버 코드 만들기

StackOverflow https://stackoverflow.com//questions/9683707

  •  13-12-2019
  •  | 
  •  

문제

우리는 레거시 서버 코드를 가지고 있으며, 우리는 ServiceStack을 사용하여 새로운 것을 포기하고 개발하려는 레거시 서버 코드를 가지고 있습니다.기존 클라이언트는 .NET에 기록되지 않습니다.우리는 클라이언트 측에서 .NET을 전혀 사용할 계획이 없습니다.

클라이언트와 서버 간의 데이터는 XML 및 JSON을 사용하여 교환 중입니다. JSON은 응답의 반환 형식으로 만 사용됩니다 (사용 가능한 일부 서비스의 일부 서비스).XML 형식은 몇 년 전에 서버 솔루션의 첫 번째 버전이 만들어 졌을 때 정의되었습니다.우리는 그것을 바꾸고 싶지 않습니다.

ServiceStack은 새로운 RESTful WebServices를 구축하여 데이터를 직렬화하고 Deserialize 과거에 설계된 형식으로 데이터를 직렬화하고 deserialize합니까 (클라이언트가 C # / net에 작성되지 않음).우리는 다음과 같은 두 가지를 통합해야합니다 : 직렬화 및 deserialization.DTO를 사용할 수 있으며 여전히 이러한 객체가 직렬화 / 비 직렬화 된 방법에 대한 제어가 가능합니다.

도움이 되었습니까?

해결책

요청 / 응답 필터를 통해 사용자 정의 로직 추가

요청 및 응답 필터 추가 방법 서비스 전후에 사용자 정의 논리가 호출됩니다. 요청 / 응답 필터링 트리 벨트 를 통해이 필터를 추가하는 것이 가장 좋습니다. 강력한> 마크 이 필터가 필요한 서비스 만 적용됩니다.

요청 필터의 문제점은 사용자 정의 de-serialization 로직을 추가하기에는 너무 늦은 요청 DTO에 대한 Deserialization 이후에 발생합니다. 이 문제를 해결하려면 다음과 같이 AppHost에 사용자 정의 요청 바인더를 등록 할 수 있습니다.

base.RegisterRequestBinder<MyRequest>(httpReq => ... requestDto);
.

이렇게하면 iHttpRequest 객체에 액세스 할 수 있으며 사용자 정의 deserialization 논리를 직접 추가 할 수 있습니다. 다른 옵션은 ServiceStack에 요청 자체를 deserialize하려고 시도하지 않고 대신 HttpRequest InputStream을 주입하므로 요청을 직접 요청할 수 있습니다.

public class Hello : IRequiresRequestStream {
    Stream RequestStream { get; set; }
}
.

이 두 가지 예제는 ServiceStack의 직렬화 및 직렬화 위키 페이지에 설명되어 있습니다. .

자신의 맞춤형 미디어 유형 등록

강력한 DTO를 반환 할 수 있지만 특정 요청에 대한 출력을 변경하는 또 다른 옵션은 Northwind vCard 사용자 정의 미디어 유형 예제 , 예 :

public static void Register(IAppHost appHost)
{
    appHost.ContentTypeFilters.Register( "text/x-vcard", SerializeToStream,  DeserializeFromStream);
}

...    

public static void SerializeToStream(IRequestContext requestContext, object response, Stream stream)
{
    var customerDetailsResponse = response as CustomerDetailsResponse;
    using (var sw = new StreamWriter(stream))
    {
        if (customerDetailsResponse != null)
        {
            WriteCustomer(sw, customerDetailsResponse.Customer);
        }
        var customers = response as CustomersResponse;
        if (customers != null)
        {
            customers.Customers.ForEach(x => WriteCustomer(sw, x));
        }
    }
}
.

다른 콘텐츠 유형에 따라 사용자 정의 XML 응답을 마운트 할 수있는 경우 좋은 옵션입니다. 응용 프로그램 / V-XML 이므로 기존 XML 형식 / 엔드 포인트와 충돌하지 않습니다. HTTP 클라이언트 위의 ContentType을 사용하면 ? format= v-xml 또는 HTTP 헤더를 사용 하여이 사용자 정의 구현을 호출하거나 HTTP 헤더를 사용하거나 Application / V-XML 내장 된 XML ContentType을 무시하려면 할 수 있지만 SerializEstream 및 DeserializEstream 메서드에 대한 원래 XMLSerializer 구현에 대한 뒤로 물러가는 것이 좋습니다.

By-Pass ServiceStack 및 사용자 정의 iHttphandler 다른 옵션은 By-Pass ServiceStack에 완전하고 대신 AppHost에서 ServiceStack의 Config에 등록하여 사용자 정의 ihttpRequest 핸들러에서 요청을 처리하는 것입니다.

 SetConfig(new EndpointHostConfig { 
    RawHttpHandlers = {
      httpReq => return IsLegacyMatch(httpReq) ? new LegacyXmlHandler() : null 
    }
 });
.

non-null (즉, 모든 핸들러) by-passes servicestack.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top