.NET 4.5和WCF请求压缩

时间:2012-11-29 05:11:28

标签: wcf rest compression asp.net-4.5

我们在第三方托管环境中托管了一个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压缩功能。

P.S。 Web服务正在ASP.NET兼容模式下运行。

p.p.s。如果我们不压缩http请求,则Web服务可以正常工作。

1 个答案:

答案 0 :(得分:0)

我查看了你的配置文件& Application_BeginRequest方法。我使用.net 4.0在我的机器上复制了你的配置文件并验证它工作正常。我还可以看到在具有.net 4.5的计算机上相同的设置失败。根据我的观察,您的问题与Application_BeginRequest中的压缩/解压缩代码无关。但是你遇到了我在[post] [1]

中描述的相同问题

[1]:WCF - Conflicting endpoints after .Net 4.5 installation“发布”。在这篇文章中,我还发布了这个问题的工作。解决方法是明确定义REST端点。按照相同的工作,我可以看到你的项目开始工作。准确地说,为了让您的项目正常工作,我需要做的就是在配置中添加这两行并显式配置服务端点。

    <services>
      <service name="<YourNamespace>.TestService">
        <endpoint address="" binding="webHttpBinding" contract="<YourNamespace>.TestService" behaviorConfiguration="RESTEndpointBehavior"/>
      </service>
    </services>

你能检查一下这是否解决了你的问题?