IIS에서 GZipped 또는 Deflated 된 서버 응답을 처리하도록 WCF 클라이언트를 얻으려면 어떻게해야합니까?WCF GZip 압축 요청/응답 처리
IIS에서 IIS 6에서 .svc wcf 서비스가 생성 한 모든 응답 (요청에 "Accept-Encoding : gzip, deflate"가 포함 된)을 gzip하는 방법에 대한 지침은 here입니다.
클라이언트에서이 헤더를 웹 요청에 삽입하는 방법에 대한 설명은 here 및 here입니다. "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 만 재정 의하여 작동합니다.
왜 솔루션을 질문의 일부가 아닌 대답으로 게시하면 받아 들일 수 있습니까? –
당신은 무엇을해야합니까? "웹 서비스에서이 작업을하려면 웹 프록시 클래스를 편집하고이 메서드를 추가해야합니다. 웹 프록시 클래스 란 무엇입니까 ?? – Naor