使用动态压缩对IIS7的异步Web服务调用不起作用

时间:2009-12-16 21:15:34

标签: asp.net web-services iis-7 compression

我们有一些ASP.NET Web服务在这种完美的风暴条件下失败了:

  1. IIS7
  2. 动态压缩已启用
  3. Web服务调用是异步
  4. 如果它是IIS 6,或者我们关闭动态压缩或同步调用Web服务,它可以正常工作。

    在调用SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)时出现“意外的文件结尾”错误。

    使用Fiddler,我发现IIS 6的响应具有'chunked'的传输编码,没有内容长度。 IIS 7的响应没有分块并且具有内容长度。文件结束错误超出内容长度1个字符。

    如果我拦截Fiddler中的消息并将其更改为chunked,则没有错误。答案可能是在IIS 7中将其更改为chunked(我已经尝试过并且失败了),但我觉得我不应该这样做:我认为它应该可行!

1 个答案:

答案 0 :(得分:0)

我不得不为微软打开MSDN支持票,但得到了答案。

这里的答案是一个简单的客户端解决方案。我之前的WebRequest方法看起来像这样:

protected override WebRequest GetWebRequest(Uri uri)
{
    var request = base.GetWebRequest(uri);
    request.Headers.Add("Accept-Encoding", "gzip");
    return request;
}

更好的方法是:

protected override WebRequest GetWebRequest(Uri uri)
{
    var request = (HttpWebRequest) base.GetWebRequest(uri);
    request.AutomaticDecompression = DecompressionMethods.GZip;
    return request;
}

我不完全确定为什么会这样:请求和响应上的标题完全相同,但客户端似乎能够管理它返回的响应。

这似乎适用于IIS6和IIS7,即使IIS6响应被分块而IIS7也没有。如果有人可以帮助解释其确切原因,那么社区可能会有所帮助。