在请求GeoCoder网站时禁用gzip压缩

时间:2011-01-21 01:11:32

标签: wcf gzip

我有一个使用/ N Software的SOAP组件用Delphi编写的示例应用程序。此应用程序与GeoCoder站点(请参阅geocoder.us)进行通信,以从提供的地址获取纬度和经度。工作正常。

写了一个非常简单的WCF客户端基本上做同样的事情,但它不起作用。我用Fiddler2来看看发生了什么。

Delphi应用程序获取基本文本。我的WCF应用程序获取gzip压缩的内容。这必须是默认值,因为我没有设置它。当响应返回时,无法解压缩数据。

我看到许多网页详细介绍了如何设置gzip压缩,但没有关于禁用此功能的内容。

问题是如何让我的WCF客户端从GeoCoder站点请求,以纯文本形式回复(我知道压缩是好的等等)但在这种情况下我只是希望看到这个工作。

网站WSDL位于http://rpc.geocoder.us/dist/eg/clients/GeoCoder.wsdl

我的源代码(我学习这些东西时非常基础)

   using System;
   using System.Collections.Generic;
   using System.ComponentModel;
   using System.Data;
   using System.Drawing;
   using System.Linq;
   using System.Text;
   using System.Windows.Forms;
   using System.ServiceModel;
   using GeoCodeTest.ServiceReference1;

   namespace GeoCodeTest
   {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private GeocoderResult[] LocationResult = null;
            private GeoCode_PortTypeClient proxy = null;

            private void btnGo_Click(object sender, EventArgs e)
            {
                LocationResult = proxy.geocode(txtLocation.Text); // always returns a null !!!
                geocoderResultBindingSource.DataSource = LocationResult;
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                proxy = new GeoCode_PortTypeClient("GeoCode_Port");
            }
        }
   }

这是生成的app.config文件。

 <?xml version="1.0" encoding="utf-8" ?>
   <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="GeoCode_Binding" closeTimeout="00:01:00" openTimeout="00:01:00"
                        receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                        useDefaultWebProxy="true">
                        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        <security mode="None">
                            <transport clientCredentialType="None" proxyCredentialType="None"
                                realm="" />
                            <message clientCredentialType="UserName" algorithmSuite="Default" />
                        </security>
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://rpc.geocoder.us/service/soap/" binding="basicHttpBinding"
                    bindingConfiguration="GeoCode_Binding" contract="ServiceReference1.GeoCode_PortType"
                    name="GeoCode_Port" />
            </client>
        </system.serviceModel>
   </configuration>

我是否可以添加/删除/更改app.config,以便WCF客户端请求请求像Delphi应用程序那样的纯文本?

2 个答案:

答案 0 :(得分:4)

仅当您的请求包含HTTP标头Accept-Encoding: gzip时,服务器才应压缩响应。请与Fiddler一起检查您的请求。如果您的请求中不存在此标头,则压缩由某些自定义机制控制。

只有基于WCF 4 HTTP的客户端才会发送该HTTP标头,因为它可以解压缩消息。如果没有,则消息有问题。您可以通过定义自定义绑定来关闭此功能:

<bindings>
  <customBinding>
    <binding name="BasicWithNoCompression">
      <textMessageEncoding messageVersion="Soap11" />
      <httpTransport decompressionEnabled="false" />
    </binding>
  </customBidning>
</bindings>

答案 1 :(得分:0)

我快速浏览了一下,并不是导致问题的压缩。如前所述,WCF客户端(v4)可以很好地解压缩数据。实际上,如果您修改传出请求消息标头并从Accept-Encoding标头中删除“gzip,deflate”,则响应已经解压缩,但数据仍然不存在于返回对象中。我认为客户端生成数据的方式似乎存在问题。

如果我有更多时间,我会仔细研究,但可能需要一段时间才能找出确切的不匹配发生的位置。