2009-06-26 12 views
9

誰かがBing Map Web Services(以前のVirtual Earth Web Services)をDelphiで使えましたか?誰かがBing Map WebサービスをDelphiで使用していますか?

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

トークンサービスとジオコードサービスWSDLドキュメントをインポートしました。

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

私は、DelphiがSOAPActionヘッダーの値を指定しないことに気づいたので、私は「http://staging.dev.virtualearth.net/webservices/v1/geocode/contracts/IGeocodeService/Geocode」を指定しようとした代わりに、次のエラーメッセージを得た:

サーバは、内部エラーのため要求を処理できませんでした。エラーの詳細については、例外情報をクライアントに送り返すために、サーバー上のIncludeExceptionDetailInFaults(ServiceBehaviorAttributeまたは<serviceDebug>構成動作)をオンにするか、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> 

答えて

3

私の最高の推測では、Delphiは、あまりにも多くのジオコード要素を生産しているようだということである - NS2に対応して任意のものがあるように表示されません:C#でのジオコードは、XMLを生成します。あなたが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リクエストを整理する方法をサポートしていないことが考えられます。

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

+0

おかげで、私は前にも似たようなしようとしたが、私はただ運で再びそれを試してみました。 –

1

私も同じ問題を抱えています。私はDelphi 2006を実行し、WSDLImp.exeをコマンドモードで使用しました。輸入作業を行うために2006年のバージョン11.0が必要でした。あなたは何を使うのですか?私たちはRemObjects、バージョン6を試すつもりです。それがうまくいくかどうかは推測できますか?

乾杯、 ラース

+0

私はDelphi 2007を使用しています。 RemObjectsに運があれば、とても興味があります。私はこのプロジェクトを数週間はやっていませんが、Bing Map APIが成熟するまで、古いMapPoint APIを使用することを期待しています。 –

関連する問題