2009-06-26 9 views
9

Est-ce que quelqu'un a déjà utilisé Bing Map Web Services (anciennement Virtual Earth Web Services) avec Delphi? Basé sur mes expériences jusqu'à présent (à la fois en utilisant Delphi et Visual Studio C#), je suis sur le point d'abandonner et d'aller avec le service web MapPoint jusqu'à ce qu'une future version de Bing Maps Web Services soit disponible. Cependant, j'ai pensé que je posterais une question ici en dernier recours ...Toute personne utilisant les services Web Bing Map avec Delphi?

J'ai importé les documents WSDL de service de jeton et de services de géocode.

J'ai réussi à obtenir un jeton du service de jeton, mais je n'ai pas réussi à faire fonctionner le service de géocodage. Il renvoie toujours le message d'erreur suivant: Le message avec Action '' ne peut pas être traité sur le récepteur, en raison d'une incompatibilité ContractFilter à l'EndpointDispatcher. Cela peut être dû soit à une non-concordance de contrat (Actions non concordantes entre l'expéditeur et le destinataire), soit à une non-concordance de liaison/sécurité entre l'expéditeur et le destinataire. Vérifiez que l'expéditeur et le destinataire ont le même contrat et la même liaison (y compris les exigences de sécurité, par exemple Message, Transport, Aucune).

Je remarqué Delphi n'a pas été spécifié une valeur pour l'en-tête SOAPAction, donc j'ai essayé de spécifier « http://staging.dev.virtualearth.net/webservices/v1/geocode/contracts/IGeocodeService/Geocode » et ont reçu le message d'erreur suivant à la place:

Le serveur n'a pas pu traiter la demande en raison d'une erreur interne . Pour plus d'informations sur l'erreur, activez IncludeExceptionDetailInFaults (depuis ServiceBehaviorAttribute ou depuis le comportement de configuration <serviceDebug>) sur le serveur afin de renvoyer les informations d'exception au client ou activez le traçage conformément au Microsoft .NET Framework 3.0 Documentation SDK et inspectez les journaux de trace du serveur. Ci-dessous est mon code Delphi et le XML brut envoyé, puis le XML brut envoyé par un appel similaire à partir du code C# de Microsoft. Il y a plusieurs différences dans le XML, mais je ne suis pas sûr de savoir quelle (s) différence (s) est la clé.

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> 

Répondre

3

Ma meilleure estimation est que Delphi semble produire trop d'éléments de géocodage - il ne semble pas être quelque chose qui correspond à NS2: géocodage dans le répertoire C# produit XML. Si vous pouvez intercepter le XML et le modifier afin qu'il ressemble à ceci, qui sait - il pourrait fonctionner:

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

L'autre problème pourrait être que le service Bing ne supporte pas la façon dont Delphi organise la requête SOAP .

Si cela ne fonctionne pas, vous pouvez peut-être trouver une autre bibliothèque SOAP que vous pouvez utiliser avec Delphi - en ayant peut-être recours à l'encapsulation d'une bibliothèque avec une interface C ou COM.

+0

Merci, j'avais essayé quelque chose de semblable, mais je viens d'essayer à nouveau avec pas de chance. –

1

J'ai très exactement le même problème. Je cours Delphi 2006, utilisé WSDLImp.exe en mode de commande; besoin de la version 11.0 de 2006 pour que l'importation fonctionne. Qu'est ce que tu utilises? Nous avons l'intention d'essayer RemObjects, version 6. Devinez si cela fonctionnerait mieux?

Cheers, Lars

+0

J'utilise Delphi 2007. Je serais très intéressé d'entendre si vous avez de la chance avec RemObjects. Je n'ai pas travaillé sur ce projet depuis quelques semaines, mais je pense que nous utiliserons l'ancienne API MapPoint à la place jusqu'à ce que l'API Bing Map arrive à maturité. –

Questions connexes