我有一个使用/ 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应用程序那样的纯文本?
答案 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”,则响应已经解压缩,但数据仍然不存在于返回对象中。我认为客户端生成数据的方式似乎存在问题。
如果我有更多时间,我会仔细研究,但可能需要一段时间才能找出确切的不匹配发生的位置。