Geo*_*off 9 asp.net iis-7 gzip web-services asmx
我有一个asp.net .asmx webservice,用于处理来自第三方工具的请求.第三方工具向Web服务发出http POST请求以获取用户信息.我正在使用IIS7
运行Fiddler并选中"删除所有编码",我可以看到webservice调用,并且一切正常.如果取消选中"删除所有编码",则Web服务调用将失败并显示400 Bad Request.我看到的区别是Fiddler正在删除标题"Content-Encoding:gzip"并且正在解压缩内容.
因此,当删除Content-Encoding标头并解压缩内容时,我的webservice功能完美.当标头存在并且内容被压缩时,web服务失败.
我怎么能:
更新:要清楚,我不需要在Response中配置gzip编码,我需要处理一个请求到我的web服务,这是gzip编码的.
更新2:第三方工具是Salesforce.com Outlook插件.因此,我无权修改它,许多其他公司也毫无困难地使用它.它必须是我正在做的事情(或不做)
更新3:我在这里发现一条帖子说IIS不支持带压缩数据的传入POST请求,它只支持压缩响应.这仍然可以吗?
最简单的技术是创建一个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()
{
}
}
Run Code Online (Sandbox Code Playgroud)
要激活此模块,请将以下部分添加到web.config中:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="AnyUniqueName"
type="YourNamespace.GZipRequestDecompressingModule, YourAssembly"
preCondition="integratedMode" />
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
我在这里找到了部分答案。
class DecompressStream : Stream
{
...
public override int Read(byte[] buffer, int offset, int count)
{
GZipStream test = new GZipStream(_sink, CompressionMode.Decompress);
int c = test.Read(buffer, offset, count);
return c;
}
...
}
Run Code Online (Sandbox Code Playgroud)
然后我可以在请求对象上指定过滤器,如下所示:
void Application_BeginRequest(object sender, EventArgs e)
{
string contentEncoding = Request.Headers["Content-Encoding"];
Stream prevCompressedStream = Request.Filter;
if(contentEncoding == null || contentEncoding.Length == 0)
return;
contentEncoding = contentEncoding.ToLower();
if(contentEncoding.Contains("gzip"))
{
Request.Filter = new DecompressStream(Request.Filter);
}
}
Run Code Online (Sandbox Code Playgroud)
我说部分答案是因为即使我现在可以处理传入的请求,响应也会获得“Content-Encoding:gzip”标头,即使响应未编码。我可以在 Fiddler 中验证内容是否未编码。
如果我对响应进行编码,则 Web 服务的客户端将失败。看来,即使它正在发送“Accept-Encoding:gzip”,但实际上它并不接受 gzip 压缩响应。我可以在 Fiddler 中验证响应是否已压缩,并且 Fiddler 将成功解压缩它。
所以,现在我一直试图从响应中删除杂散的“Content-Encoding:gzip”标头。我已经从应用程序、web.config 和 IIS 中删除了我能找到的所有压缩引用。
归档时间: |
|
查看次数: |
8339 次 |
最近记录: |