2009-11-16 4 views
24

IIS에서 GZipped 또는 Deflated 된 서버 응답을 처리하도록 WCF 클라이언트를 얻으려면 어떻게해야합니까?WCF GZip 압축 요청/응답 처리

IIS에서 IIS 6에서 .svc wcf 서비스가 생성 한 모든 응답 (요청에 "Accept-Encoding : gzip, deflate"가 포함 된)을 gzip하는 방법에 대한 지침은 here입니다.

클라이언트에서이 헤더를 웹 요청에 삽입하는 방법에 대한 설명은 herehere입니다. "Accept-Encoding : gzip, deflate".

Fiddler2는 응답이 이진이고 일반 Xml이 아니라는 것을 보여줍니다.

클라이언트는 기본적으로 예외가없는 Xml 헤더가 없다는 예외와 충돌합니다.

내 IClientMessageInspector에서 AfterReceiveReply가 호출되기 전에 앱이 충돌합니다.

일부 추가 참고 :

그들이 제 3 자에 의해 제공됩니다 (1) 나는 WCF 서비스 또는 클라이언트를 변경할 수 없습니다. 그러나 이것이 올바른 방향 인 경우 구성을 통해 동작 및/또는 메시지 검사자를 첨부 할 수 있습니다.

(2) 나는 비누 바디를 압축/압축 해제하고 싶지 않지만 전체 메시지를 압축하고 싶지 않습니다.

아이디어/솔루션?

*이 *이 해결

이러한 목표를 달성하기 위해 WCF 확장을 쓸 수 없었습니다. 대신에 나는 다음 헬퍼 클래스 옹호이 CodeProject의 article : 또한

public class CompressibleHttpRequestCreator : IWebRequestCreate 
{ 
    public CompressibleHttpRequestCreator() 
    { 
    } 

    WebRequest IWebRequestCreate.Create(Uri uri) 
    { 
     HttpWebRequest httpWebRequest = 
      Activator.CreateInstance(typeof(HttpWebRequest), 
      BindingFlags.CreateInstance | BindingFlags.Public | 
      BindingFlags.NonPublic | BindingFlags.Instance, 
      null, new object[] { uri, null }, null) as HttpWebRequest; 

     if (httpWebRequest == null) 
     { 
      return null; 
     } 

     httpWebRequest.AutomaticDecompression =DecompressionMethods.GZip | 
      DecompressionMethods.Deflate; 

     return httpWebRequest; 
    } 
} 

하고, 응용 프로그램 구성 파일에 추가 : WCF 결국 일부 공장을 묻는 일이있는 것 같다 무엇

<configuration> 
    <system.net> 
    <webRequestModules> 
     <remove prefix="http:"/> 
     <add prefix="http:" 
      type="Pajocomo.Net.CompressibleHttpRequestCreator, Pajocomo" /> 
    </webRequestModules> 
    </system.net> 
</configuration> 

인 또는 HttpWebRequest 인스턴스를 제공하기 위해 system.net에서 심층적 인 작업을 수행하고 필요한 인스턴스를 생성하라는 헬퍼를 제공합니다.

WCF 클라이언트 구성 파일에서 사용자 지정 확장 프로그램 없이도 간단한 basicHttpBinding 만 있으면됩니다.

응용 프로그램이 실행되면 클라이언트 HTTP 요청에 "Accept-Encoding : gzip, deflate"헤더가 포함되고 서버는 gzip으로 처리 된 웹 응답을 반환하고 클라이언트는 HTTP 응답을 투명하게 압축 해제 한 다음 WCF로 넘깁니다.

이 기술을 웹 서비스에 적용하려고 시도했을 때 작동하지 않는다는 것을 발견했습니다. 도우미 클래스가 WCF 클라이언트에서 사용될 때와 마찬가지로 실행되었지만 http 요청에 "Accept-Encoding : ..."헤더가 포함되지 않았습니다.이 응용 프로그램 구성 파일에서 CompressibleHttpRequestCreator 블록이었다 여부를 중요하지 않았다

protected override System.Net.WebRequest GetWebRequest(Uri uri) 
{ 
    System.Net.HttpWebRequest rq = (System.Net.HttpWebRequest)base.GetWebRequest(uri); 
    rq.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
    return rq; 
} 

참고 :

는 웹 서비스에 대해이 작업을하려면, 나는 웹 프록시 클래스를 편집하고,이 방법을 추가했다 현재 또는 없습니다. 웹 서비스의 경우 웹 서비스 프록시의 GetWebRequest 만 재정 의하여 작동합니다.

+6

왜 솔루션을 질문의 일부가 아닌 대답으로 게시하면 받아 들일 수 있습니까? –

+4

당신은 무엇을해야합니까? "웹 서비스에서이 작업을하려면 웹 프록시 클래스를 편집하고이 메서드를 추가해야합니다. 웹 프록시 클래스 란 무엇입니까 ?? – Naor

답변

1

Here's an answer I gave 다른 주제와 관련하여 그 questio ADO.NET 데이터 서비스의 관점에서 물었다지만, 내 대답은 순전히 WCF에 대한 것입니다.

2

WCF 팁 주셔서 감사합니다! 우리는 내 가게에서 서비스를위한 IIS 압축을 가능하게 할 것이며, 당신의 솔루션이 효과가 있기를 희망합니다. "웹 서비스에서이 작업을 수행하려면"- 오래된 학교용 SoapHttpProtocol 클라이언트를 의미합니까? SoapHttpProtocol 클래스에는 자동으로 압축 헤더 및 응답 처리를 처리하는 기본 제공 EnableDecompression 속성이 있기 때문입니다.

+0

그의 질문에 OP가 직접 제공 한 답이 가장 적합하고 정확한 해결책입니다. 대답으로 받아 들여야합니다. 그 점을 지적 해 주셔서 감사합니다! – Marek