我们有一个托管在第三方托管环境中的 Web 应用程序。服务器应用程序向我们的 iPad 应用程序公开一些 WCF RESTFUL 服务。
WCF 服务是 .svc-less 并在 Glonbal.asax 文件中注册。样本:
RouteTable.Routes.Add("service name", new ServiceRoute("url",
new WebServiceHostFactory(), routingServiceContract));
由于我们需要将一些海量数据从我们的 iPad 应用程序传输到服务器应用程序,因此一些请求在发送到 WCF 服务之前进行了 GZIP 压缩。由于服务器应用程序最初是基于 .NET 3.5 构建的,因此类似这样的一段代码负责解压缩压缩的请求:
public void Application_BeginRequest(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Request.Headers["Content-Encoding"]))
{
if (Request.Headers["Content-Encoding"].ToLower().Contains("gzip"))
Request.Filter = new GZipStream(Request.Filter, CompressionMode.Decompress);
if (Request.Headers["Content-Encoding"].ToLower().Contains("deflate"))
Request.Filter = new DeflateStream(Request.Filter, CompressionMode.Decompress);
}
}
这一直有效,直到我们的托管服务提供商在他们的服务器上安装了 .NET 4.5。然后压缩的 JSON 请求开始失败(我们得到 http 400 或有时 500 错误)。经过这么多调查,结果发现代码和 web.config 文件都可以,因为 WCF 服务在没有安装 .NET 4.5 的服务器上运行良好。
我什至评论了上面的代码并发布到同一个服务器,但它不再工作了。我原以为请求被解码了两次!
现在我想知道如何利用 WCF 4.5 的内置压缩功能并使该网站正常工作?我更喜欢摆脱自定义 c# 代码,只使用 WCF 4.5 压缩功能。
ps Web 服务在 ASP.NET 兼容模式下运行。
pps 如果我们不压缩 http 请求,web 服务可以完美运行。