2009-06-26 14 views
9

¿Alguien ha recibido Bing Map Web Services (anteriormente Virtual Earth Web Services) trabajando con Delphi?¿Alguien que utiliza Bing Web Web Services con Delphi?

Basado en mis experiencias hasta ahora (tanto con Delphi como con Visual Studio C#), estoy a punto de abandonarlo e ir con el servicio web MapPoint hasta que salga una versión futura de Bing Maps Web Services. Sin embargo, pensé en publicar una pregunta aquí como último recurso ...

Importé el servicio Token y los documentos WSDL de Geocode Services.

Pude con éxito obtener un token del servicio de token, pero no he podido conseguir que funcione el servicio de Geocode. Siempre devuelve el siguiente mensaje de error: El mensaje con la Acción '' no se puede procesar en el receptor, debido a una discrepancia ContractFilter en el EndpointDispatcher. Esto puede deberse a una discrepancia en el contrato (acciones no coincidentes entre el emisor y el receptor) o una falta de correspondencia vinculante/de seguridad entre el emisor y el receptor. Verifique que el remitente y el receptor tengan el mismo contrato y el mismo enlace (incluidos los requisitos de seguridad, por ejemplo, Mensaje, Transporte, Ninguno).

me di cuenta de Delphi no se especifica un valor para el encabezado SOAPAction, así que intentaron especificar "http://staging.dev.virtualearth.net/webservices/v1/geocode/contracts/IGeocodeService/Geocode" y recibieron el mensaje de error siguiente en su lugar:

El servidor no pudo procesar la solicitud debido a un error interno . Para obtener más información sobre el error, active IncludeExceptionDetailInFaults (ya sea desde ServiceBehaviorAttribute o desde el <serviceDebug> comportamiento de configuración) en el servidor para enviar de nuevo la información de excepción al cliente o active el rastreo según Microsoft .NET Framework 3.0 documentación de SDK e inspeccionar los registros de seguimiento del servidor.

A continuación se muestra mi código Delphi y el XML sin procesar que se está enviando, y luego el XML sin formato que se envía mediante una llamada similar del código de muestra C# de Microsoft. Hay varias diferencias en el XML, pero no estoy seguro de qué diferencia (s) es la clave.

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> 

Respuesta

3

Mi mejor conjetura es que Delphi parece estar produciendo demasiados elementos Geocodificar - no parece haber ninguna cosa que se corresponde con NS2: Geocode en el C# produjo XML. Si se puede interceptar el XML y cambiarlo para que se parezca a esto, ¿quién sabe - que podría funcionar:

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

El otro problema podría ser que el servicio Bing no es compatible con la forma en Delphi organiza la solicitud SOAP .

Eso no funciona, quizás pueda encontrar otra biblioteca SOAP que pueda usar con Delphi, tal vez recurriendo a envolver una biblioteca con una interfaz C o COM.

+0

Gracias, lo habían intentado algo similar antes, pero yo sólo lo intentó de nuevo, pero sin suerte. –

1

Tengo exactamente el mismo problema. Ejecuto Delphi 2006, usé WSDLImp.exe en modo comando; necesitaba la versión 11.0 de 2006 para que funcione la importación. ¿Que usas? Tenemos la intención de probar RemObjects, versión 6. ¿Adivino si eso funcionaría mejor?

Saludos, Lars

+0

Estoy usando Delphi 2007. Estaría muy interesado en saber si tiene algo de suerte con RemObjects. No he trabajado en este proyecto durante un par de semanas, pero espero que usemos la antigua API de MapPoint en su lugar hasta que la API de Bing Map madure. –