2012-07-24 2 views
2

셀프 호스팅 WCF 서비스에 선택적 gzip 압축을 어떻게 추가 할 수 있습니까? 나는이시나 리오에 WebHttpBinding을 사용하고 있습니다. Accept 헤더에 gzip 문자열이 포함되어 있고 내용이 압축되어 있는지 확인하고 싶습니다.셀프 호스팅 된 WCF 서비스에 gzip 압축 옵션 추가

맞춤 속성을 사용하고 싶습니다. 지금까지 내가 커리텀 속성을 사용하여 XML과 JSON 출력을 전환 할 수있게했지만 지금은 출력을 압축하는 방법을 알지 못합니다.

내 인코더 스위치 속성에서 을 변경하기 위해 IDispatchMessageFormatter 인터페이스를 구현했습니다. 그러나 출력을 수정하기 위해 출력이 어떻게 생성되는지에 대해서는 명확히하지 않습니다.

누군가 내 솔루션을 가리킬 수 있다면 좋을 것입니다.

+0

흥미로운 질문입니다. 왜 선택적이어야합니까? 그냥 궁금해서. gzip 압축은 HTTP를 사용하는 거의 모든 장치에서 지원되는 표준이라고 생각했기 때문에 호스팅 된 WCF 서비스는 IIS 구성 수준에서 수행합니다. – Scen

+0

텔넷을 통해 서비스를 테스트하는 것이 더 쉽습니다. 또한 제 3 자 클라이언트가 압축을 처리하는 것이 쉬운 지 잘 모르겠습니다. – rekire

+0

아, 당신은 WCF http 서비스를 테스트하기 위해 Fiddler (http://www.fiddler2.com/fiddler2/)를 시도 할 수 있습니다. 그것은 굉장. 아직 gzip을 자동으로 압축 해제하지 않는 장치에서 실행되지는 않았지만 모든 타사 클라이언트가이를 처리 할 수 ​​있는지 확실하게 말할 수는 없습니다. – Scen

답변

4

이것은 특성이 아니지만 WCF 서비스 응답을 압축하는 기본 코드이며 필요에 따라 특성으로 래핑 할 수 있습니다.

public static void CompressResponseStream(HttpContext context = null) 
{ 
    if (context == null) 
     context = HttpContext.Current; 

    string encodings = context.Request.Headers.Get("Accept-Encoding"); 

    if (!string.IsNullOrEmpty(encodings)) 
    { 
     encodings = encodings.ToLowerInvariant(); 

     if (encodings.Contains("deflate")) 
     { 
      context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress); 
      context.Response.AppendHeader("Content-Encoding", "deflate"); 
      context.Response.AppendHeader("X-CompressResponseStream", "deflate"); 
     } 
     else if (encodings.Contains("gzip")) 
     { 
      context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); 
      context.Response.AppendHeader("Content-Encoding", "gzip"); 
      context.Response.AppendHeader("X-CompressResponseStream", "gzip"); 
     } 
     else 
     { 
      context.Response.AppendHeader("X-CompressResponseStream", "no-known-accept"); 
     } 
    } 
} 

[편집] 해결하기 위해 의견 :이 응답에 속성을 설정으로

는 단순히 웹 서비스 작업의 본문에 어디서나 전화 :

[OperationContract] 
public ReturnType GetInformation(...) { 
    // do some stuff 
    CompressResponseStream(); 
} 
+0

글쎄, 그 프로젝트를 떨어 뜨 렸지만, 정말 좋아 보인다. 함수를 호출해야하는 예제를 제공 할 수 있다면 대답을 수락합니다. – rekire

+0

@rekire : 원하는대로 ... –