Web services 有人在Delphi中使用Bing地图Web服务吗?

Web services 有人在Delphi中使用Bing地图Web服务吗?,web-services,delphi,soap,mapping,bing,Web Services,Delphi,Soap,Mapping,Bing,有人使用过Bing地图Web服务(以前的虚拟地球Web服务)和Delphi吗 根据我到目前为止的经验(使用Delphi和Visual Studio C#),我准备放弃它,继续使用MapPoint Web服务,直到Bing Maps Web服务的未来版本问世。然而,我想我会在这里发布一个问题作为最后的手段 我导入了令牌服务和地理编码服务WSDL文档 我成功地从令牌服务获取令牌,但根本无法使地理编码服务工作。它始终返回以下错误消息: 由于EndpointDispatcher上的ContractFil

有人使用过Bing地图Web服务(以前的虚拟地球Web服务)和Delphi吗

根据我到目前为止的经验(使用Delphi和Visual Studio C#),我准备放弃它,继续使用MapPoint Web服务,直到Bing Maps Web服务的未来版本问世。然而,我想我会在这里发布一个问题作为最后的手段

我导入了令牌服务和地理编码服务WSDL文档

我成功地从令牌服务获取令牌,但根本无法使地理编码服务工作。它始终返回以下错误消息: 由于EndpointDispatcher上的ContractFilter不匹配,无法在接收器上处理具有操作“”的消息。这可能是因为合同不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)

我注意到Delphi没有为SOAPAction头指定值,因此我尝试指定“”,但得到了以下错误消息:

由于内部错误,服务器无法处理该请求。有关错误的详细信息,请在服务器上启用IncludeExceptionDetailInFaults(从ServiceBehaviorAttribute或从配置行为),以便将异常信息发送回客户端,或者根据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>
var
服务:IGEOCOVICE;
请求:地理编码;
答复:GeocodeResponse3;
响应索引:整数;
令牌:宽字符串;
过滤器:ArrayOfficerBase;
开始
令牌:=GetToken;
服务:=GetIGeocodeService;
请求:=Geocode.Create;
尝试
Request.Request:=GeocodeRequest.Create;
Request.Request.Credentials:=GeocodeService.Credentials.Create;//由GeocodeRequest类释放
Request.Request.Credentials.Token:=令牌;
Request.Request.Query:=AddressEdit.Text;
Request.Request.Options:=GeocodeOptions.Create;
设置长度(过滤器,1);
筛选器[0]:=ConfidenceFilter.Create;
信心过滤器(过滤器[0])。最小信心:=GeocodeService.High;
Request.Request.Options.Filters:=过滤器;
响应:=Service.Geocode(请求);
尝试
对于ResponseIndex:=低(Response.GeocodeResult.Results)到高(Response.GeocodeResult.Results)do
开始
OutputMemo.Lines.Add(Response.GeocodeResult.Results[ResponseIndex].DisplayName);
结束;
最后
回答:免费;
结束;
最后
请求。免费;
结束;
结束;
某个地址
cbYkKgNlrsGnZbn3HRP7Xp5LJMv3RR_5qecwgb792 Y3epmviadpz4mmd3fdp1osc6fwuktptog7bgfgm73ba2
高
PEZCDPxDc63NqdJugktryYalnusqdWuic9Fvhefad9Mipo75Qx9N7Il0dx3EtellN2877Pzn1YBqdl5Tg2
高
华盛顿州雷德蒙微软路1号

我最好的猜测是Delphi似乎生成了太多的地理编码元素——在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">
    ...
。。。
...
另一个问题可能是Bing服务不支持Delphi组织SOAP请求的方式


如果这不起作用,也许您可以找到另一个可以与Delphi一起使用的SOAP库—也许需要使用C或COM接口包装库。

我也有同样的问题。我运行Delphi2006,在命令模式下使用WSDLImp.exe;需要2006年11.0版才能完成导入工作。你用什么?我们打算尝试RemObjects,版本6。你猜这样会不会更好

干杯,
Lars

谢谢,我以前也尝试过类似的方法,但我只是再次尝试,运气不佳。我使用的是Delphi 2007。我很想知道你是否有关于RemObjects的运气。我已经有两周没有做这个项目了,但我希望我们会使用旧的MapPointAPI,直到Bing地图API成熟。