GZIP通过WCF将请求压缩到远程Web服务

时间:2016-01-12 16:12:24

标签: c# .net web-services wcf

我正在使用需要与远程Web服务进行通信的Visual Studio 2010编写应用程序。由于提交的数据量可能很大(最多100MB),因此服务的文档说必须使用GZIP HTTP压缩发送请求消息。

我的问题是如何做到这一点,因为我只是在Visual Studio生成的代理对象上调用一个方法,而不是自己实际执行POST?换句话说,因为没有"请求"在我的代码GZIP的任何地方,我如何告诉WCF为我做这件事?

我通过使用提供的WSDL向我的应用程序添加服务引用来连接到服务,然后在Visual Studio生成的代理上调用一个方法来提交请求。消息引发异常"必须使用HTTP压缩发送请求消息。" (当然,这并不意外。)

enter image description here

web.config设置中是否有一个属性定义了WCF服务,该服务会导致WCF在将请求发送到远程主机之前对其进行GZIP处理?

注意:我花了大量时间在网上搜索此内容,但问题是大多数帖子都认为它是网络服务的 响应 需要压缩。但是,在我的情况下,它是从我的客户发送的 请求

2 个答案:

答案 0 :(得分:1)

似乎我已经能够以一种对我来说没有任何意义的方式来解决这个问题,为什么这个问题甚至存在?#34;方式。

首先,我正在处理与您相同的任务:尝试使用代理对象来创建Web请求,最终遇到无法压缩客户端对象的同一问题。

我最终得到的解决方案是手动创建一个XDocument对象(XmlDocument也可以工作),它具有与所需SOAP XML相同的结构,然后使用(已经)填充的代理对象来填充必要的XML值。 SOAP XML的字符串。

从那里我创建了一个HttpWebRequest对象,并在请求中添加了相应的标头。其中一个标题是压缩。执行代码导致获得完全不同的非压缩相关错误。

您可以在此处查看HttpWebRequest的解决方案:Compress a HttpWebRequest using gzip

通过这个代理对象做起来并不容易,这似乎很愚蠢。但是,可能是第三方没有公开必要的内容,以便在请求标题中添加属性,以及a。)他们不知道或b。)他们不关心,但是不幸的是,这是我们必须合作的。

我必须在我的截止日期前解决问题,但我希望这也可以帮助你。

答案 1 :(得分:0)

您是否尝试将<binaryMessageEncoding />添加到<customBinding />元素?我认为我们正在开展类似的工作,我也收到了上述FaultException。另外两个SO主题让我误解了这个问题。这是有道理的,因为我还没有通过代码创建WebRequest,而是通过在导入第三方提供的WSDL时创建的服务引用来调用服务。

WCF custom binding for compression(基于代码的方法)

WCF client endpoint compression(基于配置的方法)

如果您在上述方法中取得任何成功,请告诉我。

修改
以下主题中的答案表明,除非您可以控制Web服务和客户端,否则可能是可以完成的。

Using compression with C# webservice client in Visual Studio 2010

编辑#2
我想有些人已经能够在使用GZip压缩第三方服务请求方面取得进展。请查看此帖子:Getting error for content mismtach while consuming client web service

该帖子帮助我摆脱了我收到的错误消息(这告诉我必须使用HTTP压缩进行请求)。我希望它对你有帮助。

  

必须使用HTTP压缩(RFC 1952 - GZIP)发送请求消息。