繁体   English   中英

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

[英]Async Web Service calls to IIS7 with Dynamic Compression don't work

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

  1. IIS7
  2. 动态压缩已打开
  3. Web服务调用是异步的

如果是IIS 6,或者我们关闭了动态压缩功能或同步调用了Web服务,则它可以正常工作。

它在对SoapHttpClientProtocol.EndInvoke(IAsyncResult asyncResult)的调用中失败,并出现“意外的文件结尾”错误。

使用Fiddler,我看到来自IIS 6的响应具有“块式”的传输编码,并且没有内容长度。 IIS 7的响应未分块,并且具有内容长度。 文件结束错误发生在内容长度之后的1个字符处。

如果我在Fiddler中拦截消息并将其更改为成块,则不会出现错误。 答案可能是将其更改为IIS 7中的分块(我尝试这样做并失败了),但是我觉得我不应该这样做:我认为它应该可以工作!

我必须为此与Microsoft开一张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都适用。 如果有人可以帮助您确切解释其工作原理,则可能对社区有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM