asp.net webservice处理gzip压缩请求

前端之家收集整理的这篇文章主要介绍了asp.net webservice处理gzip压缩请求前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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插件.因此,我无权修改它,许多其他公司也没有遇到麻烦.它必须是我正在做的事情(或不做)

更新3:我发现一个here帖子说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()
    {
    }
}

要激活此模块,请将以下部分添加到web.config中:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="AnyUniqueName"
            type="YourNamespace.GZipRequestDecompressingModule,YourAssembly"
            preCondition="integratedMode" />
    </modules>
</system.webServer>

猜你在找的asp.Net相关文章