我有一个asp.net .asmx webservice,用于处理来自第三方工具的请求.第三方工具向Web服务发出http POST请求以获取用户信息.我正在使用IIS7
运行Fiddler并选中“删除所有编码”,我可以看到webservice调用,并且一切正常.如果取消选中“删除所有编码”,则Web服务调用将失败,并显示400 Bad Request.我看到的差异是Fiddler正在删除标题“Content-Encoding:gzip”,内容正在解压缩.
因此,当删除Content-Encoding标头并解压缩内容时,我的webservice功能完美.当标头存在并且内容被压缩时,web服务失败.
我怎么能:
>配置我的webservice告诉客户端它不接受压缩请求(并希望第三方工具尊重它)
>在asp.net处理的早期解压缩内容
>修改我的Web服务以使用压缩数据
更新:要清楚,我不需要在Response中配置gzip编码,我需要处理一个请求到我的web服务,这是gzip编码的.
更新2:第三方工具是Salesforce.com Outlook插件.因此,我无权修改它,许多其他公司也没有遇到麻烦.它必须是我正在做的事情(或不做)
解决方法
最简单的技术是创建一个替换请求过滤器的HttpModule.它更可重用,并避免使用Global.asax.由于GZipStream已为此做好准备,因此无需创建新的解压缩流类.这是完整的代码,它还删除了不再需要的Content-Encoding:gzip:
public class GZipRequestDecompressingModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += (sender,e) => { var request = (sender as HttpApplication).Request; string contentEncoding = request.Headers["Content-Encoding"]; if (string.Equals(contentEncoding,"gzip",StringComparison.OrdinalIgnoreCase)) { request.Filter = new GZipStream(request.Filter,CompressionMode.Decompress); request.Headers.Remove("Content-Encoding"); } }; } public void Dispose() { } }
要激活此模块,请将以下部分添加到web.config中:
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="AnyUniqueName" type="YourNamespace.GZipRequestDecompressingModule,YourAssembly" preCondition="integratedMode" /> </modules> </system.webServer>