【问题标题】:Delphi XE2 HTTPRIO Unable to retrieve the URL endpoint for Service/PortDelphi XE2 HTTPRIO 无法检索服务/端口的 URL 端点
【发布时间】:2012-01-23 15:50:16
【问题描述】:

我正在将一个 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。

【问题讨论】:

  • 在设计时,当您设置 HTTPRIO.WSDLLLocation 属性时,您是否能够选择 HTTPRIO.Service 和 HTTPRIO.Port 属性?您应该能够在设计时设置服务和端口,如果没有,那么 URL 可能有问题。我已经多次遇到这个问题,似乎只要我在设计时正确设置一次,错误就会消失..
  • 嗨,John,谢谢,在 Delphi 2007 ide 和 Xe2 中,该端口是空白的。设置它只会更改错误消息。我刚刚尝试连接到另一个 delphi WSDL 并且遇到了同样的问题。我将尝试连接到 c# WSDL 或 Amazon DLL 之一,看看我是否可以确定它是否只是导致问题的 delphi wsdls。我会在今天晚些时候回复。
  • 刚刚确认 Xe2 可以连接到 .net Web 服务。我的 delphi Web 服务中一定有什么东西导致了端点错误。
  • John - 似乎我可以为我的一项服务解决它,有两个端口和服务相同 - 我选择了第二个并且它有效。问题是为什么?两个在 DELPHI XE2 上。我也无法确定在其他网络服务上使用哪种组合(我需要的是 sods 法)!
  • 有多个同名服务?我认为这就是问题所在..您可能想要评估您的网络服务的构建..

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


【解决方案1】:

解决了。好样的! 似乎 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;

谢谢大家

【讨论】:

  • Richard,Anks for ans 但是当我使用上面的代码时出现问题,没有找到活动文档。所以我明确地将其设为活动。
  • 在运行时设置属性时如何解决“无活动文档”?
【解决方案2】:

在 delphi 10.3 中,您必须在运行时明确设置“HTTPRIO1”的属性“Port”和“WSDLLLocation”。

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

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

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2022-10-04
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2014-06-10
    相关资源
    最近更新 更多