2009-06-26 11 views
9

Czy ktoś uzyskał usługi Bing Map Web Services (dawniej Virtual Earth Web Services) współpracujące z Delphi?Ktoś używający Bing Map Web Services z Delphi?

Opierając się na moich dotychczasowych doświadczeniach (zarówno przy użyciu Delphi, jak i Visual Studio C#), jestem gotowy zrezygnować z niego i korzystać z usługi MapPoint Web Service, dopóki nie pojawi się przyszłą wersję usług sieciowych Bing Maps. Pomyślałem jednak, że zadam tutaj pytanie w ostateczności ...

Zaimportowałem dokumenty WSDL usługi Token Service i usługi geokodowania.

Udało mi się uzyskać token z usługi tokena, ale nie mogłem w ogóle uruchomić usługi geokodowania. Zawsze zwraca następujący komunikat o błędzie: Komunikat z działaniem '' nie może zostać przetworzony w odbiorniku z powodu niezgodności ContractFilter w EndpointDispatcher. Może to być spowodowane niedopasowaniem umowy (niedopasowane działania między nadawcą a odbiorcą) lub niedopasowaniem powiązania/bezpieczeństwa między nadawcą a odbiorcą. Sprawdź, czy nadawca i odbiorca mają tę samą umowę i to samo wiązanie (w tym wymogi bezpieczeństwa, np. Wiadomość, transport, brak).

zauważyłem Delphi nie określając wartość nagłówka SoapAction, więc próbowałem określenie „http://staging.dev.virtualearth.net/webservices/v1/geocode/contracts/IGeocodeService/Geocode” i mam następujący komunikat o błędzie Zamiast:

Serwer nie może przetworzyć żądania z powodu błędu wewnętrznego . Aby uzyskać więcej informacji o błędzie, włącz funkcję IncludeExceptionDetailInFaults (z ServiceBehaviorAttribute lub z zachowania konfiguracyjnego <serviceDebug>) na serwerze, aby wysłać informacje o wyjątku z powrotem do klienta lub włączyć śledzenie zgodnie z programem Microsoft .NET Framework 3.0 Dokumentacja SDK i sprawdź dzienniki śledzenia serwera.

Poniżej znajduje się mój kod Delphi i wysyłany nieprzetworzony XML, a następnie nieprzetworzony XML wysyłany przez podobne wywołanie z przykładowego kodu C# firmy Microsoft. Istnieje kilka różnic w kodzie XML, ale nie jestem pewien, co to jest różnica (y).

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> 

Odpowiedz

3

Mój najlepszy przypuszczenie to, że wydaje się być Delphi produkuje zbyt wiele elementów Geokodując - nie wydaje się być żadnej rzeczy, która odpowiada NS2: Geokodując w C# produkowane XML. Jeśli można przechwycić XML i zmienić go tak, że wygląda na to, kto wie - może pracować:

... 
    <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"> 
    ... 

Innym problemem może być to, że usługa Bing nie obsługuje drogę Delphi organizuje żądania SOAP .

To nie działa, może znajdziesz inną bibliotekę SOAP, z której możesz korzystać w Delphi - być może w przypadku zawijania biblioteki z interfejsem C lub COM.

+0

Dzięki, próbowałem coś podobnego wcześniej, ale ja po prostu próbowałem go ponownie bez powodzenia. –

1

Mam z tym samym problemem. Uruchomiłem Delphi 2006, użyłem WSDLImp.exe w trybie poleceń; potrzebna wersja 11.0 z 2006 roku, aby uzyskać pracę importową. Czego używasz? Mamy zamiar wypróbować RemObjects, wersja 6. Czy wiesz, czy to by działało lepiej?

Cheers, Lars

+0

Używam Delphi 2007. Byłbym bardzo zainteresowany, aby usłyszeć, jeśli masz szczęście z RemObjects. Nie pracowałem nad tym projektem przez kilka tygodni, ale spodziewam się, że użyjemy starego interfejsu MapPoint API, dopóki API Bing Map nie dojrzeje. –