【问题标题】:How to handle Compressed Request in WCF service如何处理 WCF 服务中的压缩请求
【发布时间】:2015-04-01 02:14:03
【问题描述】:

我们在带有 .NET Framework 4.5 的 IIS 7 上托管了 WCF REST 服务。客户端正在发送带有请求标头的 GZip 压缩格式的数据:

内容编码:gzip 内容类型:application/xml

但是如果请求是压缩格式的,我们会收到来自服务器的错误请求。我们通过实现将过滤/修改传入请求的 IHttpModule 启用请求压缩。据我了解,这是失败的,因为 WCF 使用原始内容长度(压缩数据的长度)而不是解压缩数据。所以这是我的问题:

有什么方法可以解决 IIS7/.NET 4.5 中的内容长度问题?我的 HTTP 模块实现如下:

httpApplication.Request.Filter = New GZipStream(httpApplication.Request.Filter, CompressionMode.Decompress)`

如果在服务器端无法解决内容长度问题,有什么方法可以通过压缩请求从客户端发送原始内容长度?客户端实现如下:

using (Stream requeststream = serviceRequest.GetRequestStream())
{
   if (useCompression)
   {
       using (GZipStream zipStream = new GZipStream(requeststream, CompressionMode.Compress))
       {
           zipStream.Write(bytes, 0, bytes.Length);
           zipStream.Close();
           requeststream.Close();
       }

       serviceRequest.Headers.Add("Content-Encoding", "gzip");
   }
   else
   {
       requeststream.Write(bytes, 0, bytes.Length);
       requeststream.Close();
   }
}

【问题讨论】:

  • 我遇到了同样的事情。您可以使用模块向请求添加过滤器,但是一旦进入 WCF,它仍然会出现异常,因为现在请求具有不同的内容长度。

标签: wcf


【解决方案1】:

我能够使用 wsHTTPBinding 让 gzip 在 WCF 中工作,并将其作为 Web 请求的基础:

private HttpWebRequest GetWebRequest()
{
  dynamic objHTTPReq = (HttpWebRequest)WebRequest.CreateDefault(_URI);
  objHTTPReq.ContentType = "text/xml; charset=\"utf-8\"";
  objHTTPReq.Method = "POST";
  objHTTPReq.Accept = "gzip, deflate";
  objHTTPReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; OfficeLiveConnector.1.3;OfficeLivePatch.0.0; Zune 3.0; MS-RTC LM 8)";
  objHTTPReq.Headers.Add("SOAPAction", "http://xxx.yyyy.zzzz");
  return objHTTPReq;
}

那就试一试吧。祝你好运。

【讨论】:

  • 我也试过了,但传入的请求仍然是压缩的,所以除非我添加过滤器,否则我会得到压缩流。是否有指示 WCF 识别压缩请求的设置?
猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2011-08-21
  • 2014-02-05
  • 2012-12-18
相关资源
最近更新 更多