Delphi XE2 HTTPRIO无法检索服务/端口的URL端点

时间:2012-01-23 15:50:17

标签: delphi wsdl delphi-xe2 delphi-2010 webservice-client

我正在将Delphi 2007程序转换为Delphi XE2并出现以下错误消息:

  

无法从WSDL'http:// .....'

中检索服务/端口“/”的URL端点

我连接的服务是用Delphi 2007编写的。

2007年,它编译并运行没有问题。 在具有相同代码的XE2上,它会出现错误。

我尝试使用新的WSDL导入器重新导入接口,并设置了默认设置但没有欢乐。

我也尝试过设置端口和服务名称,错误仍然存​​在。不确定哪些信息有用,但据我所知它正在连接。

这是我正在使用的方法的操作

<operation name="CheckRegistration">
  <soap:operation soapAction="urn:ScubaUpdateWSIntf-IScubaUpdateWS#CheckRegistration" style="rpc"/>
  <input>
    <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"     namespace="urn:ScubaUpdateWSIntf-IScubaUpdateWS"/>
  </input>
  <output>
    <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:ScubaUpdateWSIntf-IScubaUpdateWS"/>
  </output>
</operation> 

这是消息:

<message name="CheckRegistration10Request">
  <part name="centreId" type="xs:int"/>
  <part name="centreName" type="xs:string"/>
  <part name="checkActiveOnly" type="xs:boolean"/>
</message>
<message name="CheckRegistration10Response">
  <part name="return" type="xs:boolean"/>
</message>

除了导入WSDL之外,抛出HTTPRIO并使用

调用方法
(HTTPRIO1 as IScubaUpdateWS).CheckRegistration(strtoint(tcentre),tcentreName,true);

我认为我没有做任何其他事情,因为我说同样的代码适用于Delphi 2007。

2 个答案:

答案 0 :(得分:2)

解决。好吧! 似乎Delphi XE2正在寻找2项服务,而Delphi 2007正在寻找这项服务。 我正在使用的程序是从注册表中读取WSDL位置并进行设置。在Delphi 2007上它很好,因为它正在使用唯一的服务并制作选定的端口/服务。在Delphi XE2上,重置WSDL位置会导致端口和服务被清除。 感谢@JohnEasley指出我正确的方向。 要解决我现在必须在更改WSDL位置后使用以下代码。 不确定它是否适用于每个人,因为我假设第一个条目是必需的条目

servicenames:=Tdomstrings.Create;
portnames:=Tdomstrings.Create;
HTTPRIO1.WSDLItems.GetServices(servicenames);
if servicenames.count>0 then 
begin
 HTTPRIO1.Service:=servicenames[0];
 HTTPRIO1.WSDLItems.GetPortsForService(servicenames[0],portnames);
 if portnames.count>0 then
  HTTPRIO1.Port:=portnames[0];
end;
servicenames.clear;
servicenames.Free;
portnames.clear;
portnames.Free;

谢谢你们

答案 1 :(得分:0)

在 delphi 10.3 中,您必须在运行时显式设置“HTTPRIO1”的属性“Port”和“WSDLLocation”。

对于表单“创建”事件中的示例:

HTTPRIO1.WSDLLocation:=defWSDL; 
//HTTPRIO1.URL:=defURL;    
//one of URL or WSDLLocation is enough.    
HTTPRIO1.Service:=defSvc;     
HTTPRIO1.Port:=defPrt;     

谢谢