Отключить сжатие gzip в запросе к веб-сайту GeoCoder - PullRequest
1 голос
/ 21 января 2011

У меня есть пример приложения, написанного на Delphi с использованием компонента SOAP / N Software.Это приложение связывается с сайтом GeoCoder (см. Geocoder.us), чтобы получить широту и долготу от предоставленного адреса.Работает нормально.

Написал очень простой клиент WCF, который делает то же самое, но не работает.Я использовал Fiddler2, чтобы увидеть, что происходит.

Приложение Delphi возвращает основной текст.Мое приложение WCF возвращает содержимое, сжатое gzip.Это должно быть по умолчанию, так как я не установил это.Когда ответ возвращается, средства для распаковки отсутствуют.

Я вижу много веб-страниц, подробно рассказывающих о настройке сжатия gzip, но ничего об этом не отключающих.

Вопрос в том, как можноЯ получаю свой клиент WCF, чтобы запросить с сайта GeoCoder ответ в виде простого текста (я знаю, что сжатие хорошо и т. Д.), Но в этом случае я просто хочу, чтобы это работало.1011 *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 ]

4 голосов
/ 21 января 2011

Сервер должен сжимать ответ, только если ваш запрос содержит HTTP-заголовок Accept-Encoding: gzip.Проверьте ваш запрос с Fiddler.Если этот заголовок отсутствует в вашем запросе, сжатие управляется каким-то настраиваемым механизмом.

Только клиент на основе HTTP WCF 4 отправляет этот заголовок HTTP, потому что он из коробки способен распаковать сообщение.Если это не так, то с сообщением что-то не так.Вы можете отключить эту функцию, определив пользовательскую привязку:

<bindings>
  <customBinding>
    <binding name="BasicWithNoCompression">
      <textMessageEncoding messageVersion="Soap11" />
      <httpTransport decompressionEnabled="false" />
    </binding>
  </customBidning>
</bindings>
0 голосов
/ 23 января 2011

Я быстро взглянул на это, и проблема не в сжатии.Как уже упоминалось, клиенты WCF (v4) могут хорошо распаковывать данные.Фактически, если вы измените заголовок сообщения исходящего запроса и удалите «gzip, deflate» из заголовка Accept-Encoding, ответ возвращается уже без сжатия, однако данные по-прежнему отсутствуют в возвращаемом объекте.Я думаю, что есть проблема с тем, как клиент сгенерировал свой контракт данных, я думаю.

Если у меня будет еще немного времени, я посмотрю поближе, но это может занять некоторое время, чтобы выяснить, где точное несоответствиеs) происходят.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...