Кто-нибудь использует Bing Map Web Services с Delphi? - PullRequest
9 голосов
/ 26 июня 2009

Кто-нибудь получал, чтобы веб-службы Bing Map (ранее - Virtual Earth Web Services) работали с Delphi?

Исходя из моего опыта (как с использованием Delphi, так и Visual Studio C #), я готов отказаться от него и перейти к веб-службе MapPoint до появления будущей версии Bing Maps Web Services. Тем не менее, я подумал, что оставлю здесь вопрос в крайнем случае ...

Я импортировал документы WSDL Token Service и Geocode Services.

Мне удалось получить токен из сервиса токенов, но я не смог заставить работать сервис Geocode. Всегда возвращается следующее сообщение об ошибке: Сообщение с действием '' не может быть обработано в получателе из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть связано либо с несоответствием контракта (несоответствующие действия между отправителем и получателем), либо с несоответствием привязки / безопасности между отправителем и получателем. Убедитесь, что отправитель и получатель имеют одинаковый контракт и одинаковую привязку (включая требования безопасности, например, Сообщение, Транспорт, Нет).

Я заметил, что Delphi не указывает значение для заголовка SOAPAction, поэтому я попытался указать "http://staging.dev.virtualearth.net/webservices/v1/geocode/contracts/IGeocodeService/Geocode" и вместо этого получил следующее сообщение об ошибке:

Серверу не удалось обработать запрос из-за внутренней ошибки. Для получения дополнительной информации об ошибке либо включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведения конфигурации ) на сервере, чтобы отправить информацию об исключении обратно клиенту, либо включите трассировку в соответствии с Microsoft .NET Framework. 3.0 SDK документация и проверка журналов трассировки сервера.

Ниже приведен мой код Delphi и отправка необработанного XML, затем необработанный XML, отправляемый аналогичным вызовом из примера кода C # от Microsoft. В XML есть несколько отличий, но я не уверен, какая разница (и) является ключом.

var
  Service: IGeocodeService;
  Request: Geocode;
  Response: GeocodeResponse3;
  ResponseIndex: Integer;
  Token: WideString;
  Filters: ArrayOfFilterBase;
begin
  Token := GetToken;

  Service := GetIGeocodeService;

  Request := Geocode.Create;
  try
    Request.request := GeocodeRequest.Create;

    Request.request.Credentials := GeocodeService.Credentials.Create; // Freed by GeocodeRequest class
    Request.request.Credentials.Token := Token;

    Request.request.Query := AddressEdit.Text;

    Request.request.Options := GeocodeOptions.Create;

    SetLength( Filters, 1 );
    Filters[ 0 ] := ConfidenceFilter.Create;
    ConfidenceFilter( Filters[ 0 ] ).MinimumConfidence := GeocodeService.High_;

    Request.request.Options.Filters := Filters;

    Response := Service.Geocode( Request );
    try
      for ResponseIndex := Low( Response.GeocodeResult.Results ) to High( Response.GeocodeResult.Results ) do
      begin
        OutputMemo.Lines.Add( Response.GeocodeResult.Results[ ResponseIndex ].DisplayName );
      end;
    finally
      Response.Free;
    end;
  finally
    Request.Free;
  end;
end;


<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS2="http://dev.virtualearth.net/webservices/v1/geocode/contracts" xmlns:NS3="http://dev.virtualearth.net/webservices/v1/geocode" xmlns:NS4="http://dev.virtualearth.net/webservices/v1/common">
        <NS1:Geocode xmlns:NS1="http://dev.virtualearth.net/webservices/v1/geocode/contracts">
            <parameters href="#1"/>
        </NS1:Geocode>
        <NS2:Geocode id="1" xsi:type="NS2:Geocode">
            <request href="#2"/>
        </NS2:Geocode>
        <NS3:request id="2" xsi:type="NS3:GeocodeRequest">
            <Credentials href="#3"/>
            <Options href="#4"/>
            <Query xsi:type="xsd:string">Some Address</Query>
        </NS3:request>
        <NS4:Credentials id="3" xsi:type="NS4:Credentials">
            <Token xsi:type="xsd:string">cbYkKgNlrsGnZbn3HRP7Xp5LJMv3RR_5qECwgB792COfY3EPmviaDpZ4mmD3fDP1Osc6fWUkTptog7bfgM73bA2</Token>
        </NS4:Credentials>
        <NS3:Options id="4" xsi:type="NS3:GeocodeOptions">
            <Filters xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:FilterBase[1]">
                <item href="#5"/>
            </Filters>
        </NS3:Options>
        <NS3:ConfidenceFilter id="5" xsi:type="NS3:ConfidenceFilter">
            <MinimumConfidence xsi:type="NS4:Confidence">High</MinimumConfidence>
        </NS3:ConfidenceFilter>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <Geocode xmlns="http://dev.virtualearth.net/webservices/v1/geocode/contracts">
            <request xmlns:a="http://dev.virtualearth.net/webservices/v1/geocode" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <Credentials xmlns="http://dev.virtualearth.net/webservices/v1/common">
                    <ApplicationId i:nil="true"/>
                    <Token>pezCDpJoxdCG63NQdJUGkTrYYalnuSQDwuIC9FvheFAd9MIPO75qX9n7il0dx3eTEHlN2877PzN1_6YbQDL5tg2</Token>
                </Credentials>
                <Culture i:nil="true" xmlns="http://dev.virtualearth.net/webservices/v1/common"/>
                <ExecutionOptions i:nil="true" xmlns="http://dev.virtualearth.net/webservices/v1/common"/>
                <UserProfile i:nil="true" xmlns="http://dev.virtualearth.net/webservices/v1/common"/>
                <a:Address i:nil="true" xmlns:b="http://dev.virtualearth.net/webservices/v1/common"/>
                <a:Options>
                    <a:Count i:nil="true"/>
                    <a:Filters>
                        <a:FilterBase i:type="a:ConfidenceFilter">
                            <a:MinimumConfidence>High</a:MinimumConfidence>
                        </a:FilterBase>
                    </a:Filters>
                </a:Options>
                <a:Query>1 Microsoft Way, Redmond, WA</a:Query>
            </request>
        </Geocode>
    </s:Body>
</s:Envelope>

Ответы [ 2 ]

3 голосов
/ 09 июля 2009

Мое лучшее предположение заключается в том, что Delphi, похоже, производит слишком много элементов Geocode - кажется, нет ничего, что соответствовало бы NS2: Geocode в XML, создаваемом на C #. Если вы можете перехватить XML и изменить его так, чтобы он выглядел следующим образом, кто знает - это может сработать:

    ...
    <NS1:Geocode xmlns:NS1="http://dev.virtualearth.net/webservices/v1/geocode/contracts">
        <parameters href="#2"/>
    </NS1:Geocode>
    <NS3:request id="2" xsi:type="NS3:GeocodeRequest">
    ...

Другая проблема может заключаться в том, что служба Bing не поддерживает способ, которым Delphi организует SOAP-запрос.

Если это не работает, возможно, вы можете найти другую библиотеку SOAP, которую вы можете использовать с Delphi - возможно, прибегнув к обертыванию библиотеки с помощью интерфейса C или COM.

1 голос
/ 19 августа 2009

У меня точно такая же проблема. Я запускаю Delphi 2006, использовал WSDLImp.exe в командном режиме; необходима версия 11.0 от 2006 года, чтобы получить работу импорта. Что ты используешь? У нас есть намерение попробовать RemObjects версии 6. Можно ли предположить, что это будет работать лучше?

Ура, Lars

...