9

Delphi で動作する Bing Map Web Services (以前の Virtual Earth Web Services) を取得した人はいますか?

これまでの経験 (Delphi と Visual Studio C# の両方を使用) に基づいて、Bing Maps Web Services の将来のバージョンがリリースされるまでは、MapPoint Web Service を使用することをあきらめて、MapPoint Web Service を使用する準備ができています。しかし、最後の手段としてここに質問を投稿しようと思いました...

Token Service と Geocode Services の WSDL ドキュメントをインポートしました。

トークン サービスからトークンを正常に取得できましたが、Geocode サービスをまったく機能させることができませんでした。常に次のエラー メッセージが返されます。EndpointDispatcher での ContractFilter の不一致により、受信側でアクション '' のメッセージを処理できません。これは、コントラクトの不一致 (送信者と受信者の間のアクションの不一致) または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインド (メッセージ、トランスポート、なしなどのセキュリティ要件を含む) を持っていることを確認します。

Delphi が SOAPAction ヘッダーの値を指定していないことに気付いたので、「http://staging.dev.virtualearth.net/webservices/v1/geocode/contracts/IGeocodeService/Geocode」を指定してみましたが、代わりに次のエラー メッセージが表示されました。 :

内部エラーのため、サーバーは要求を処理できませんでした。エラーの詳細については、サーバーで (ServiceBehaviorAttribute または <serviceDebug> 構成動作のいずれかから) IncludeExceptionDetailInFaults をオンにして、例外情報をクライアントに送り返すか、Microsoft .NET Framework に従ってトレースをオンにします。 3.0 SDK ドキュメントを参照し、サーバー トレース ログを調べます。

以下は、私の Delphi コードと、送信される生の XML です。次に、Microsoft のサンプル C# コードからの同様の呼び出しによって生の XML が送信されます。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>
4

2 に答える 2

3

私の推測では、Delphi が生成する Geocode 要素が多すぎるようです。C# で生成された XML には、NS2:Geocode に対応するものはないようです。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">
    ...

もう 1 つの問題は、Delphi が SOAP 要求を編成する方法を Bing サービスがサポートしていないことです。

おそらく、Delphi で使用できる別の SOAP ライブラリを見つけることができます。おそらく、ライブラリを C または COM インターフェイスでラップすることに頼っています。

于 2009-07-08T23:40:00.700 に答える