.NET 4.5和WCF请求压缩



我们有一个在第三方托管环境中托管的web应用程序。服务器应用程序向我们的iPad应用程序公开了一些WCF RESTFUL服务。

WCF服务没有.svc,并且在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服务就可以完美地工作。

我查看了您的配置文件&Application_BeginRequest方法。我用.net 4.0在我的机器上复制了你的配置文件,并验证了它运行良好。我还可以看到,在.net 4.5的机器上,同样的设置也会失败。根据我的观察,您的问题与Application_BeginRequest中的压缩/解压缩代码无关。但你遇到了我在这篇文章中描述的同样的问题[1]

[1] :WCF-.Net 4.5安装"Post"后发生冲突的终结点。在这篇文章中,我也发布了关于这个问题的工作。解决方法是显式定义REST端点。按照同样的工作,我可以看到你的项目开始工作。为了让您的项目正常工作,我所要做的就是在配置中添加这两行,并显式配置服务端点。

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

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

最新更新