3

如何检查 WebService 是否可用或是否有有效的 url?

我正在使用 Delphi 向导来导入和自动生成必要的 WSDL 函数。

如果 WSDL 或 URL 错误,向导为我创建的函数不会引发异常也不会返回空对象。只有当我调用返回的 WSDL 类的函数时,它才会抛出一个奇怪的异常,即 XML-String 没有有效的“text/html”样式。

这是自动生成的 WSDL 函数:

function GetcheckVatPortType(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): checkVatPortType;
const
  defWSDL = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
  defURL  = 'http://ec.europa.eu/taxation_customs/vies/services/checkVatService';
  defSvc  = 'checkVatService';
  defPrt  = 'checkVatPort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as checkVatPortType);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;

  // ************************************************************************ //
  // Namespace : urn:ec.europa.eu:taxud:vies:services:checkVat
  // Transport : http://schemas.xmlsoap.org/soap/http
  // Stil     : document
  // Verwenden von       : literal
  // Bindung   : checkVatBinding
  // Service   : checkVatService
  // Port      : checkVatPort
  // URL       : http://ec.europa.eu/taxation_customs/vies/services/checkVatService
  // ************************************************************************ //
  checkVatPortType = interface(IInvokable)
  ['{0F901373-2432-32E2-C99D-95B53AE83C79}']

    // Entpacken nicht möglich: 
    //     - Mehrere strenge out-Elemente gefunden
    function  checkVat(const parameters: checkVat): checkVatResponse; stdcall;

    // Entpacken nicht möglich: 
    //     - Mehrere strenge out-Elemente gefunden
    function  checkVatApprox(const parameters: checkVatApprox): checkVatApproxResponse; stdcall;
  end;

如果defWSDLordefURL无效或不可用,则返回一个初始化的checkVatPortType类/接口。之后在返回的接口上调用函数 ( checkVatPortType.checkVat),我得到了奇怪的异常。

这意味着,如果 WebService 不可用,用户会收到一条消息,指出“XML-String 没有有效的“text/html”格式”。这没有描述问题。

4

1 回答 1

3

这是“按设计”。只有调用 Web 服务才会导致网络运行,只有这样网络层才会失败或成功。

创建 web 服务引用就像拿起电话,执行 web 服务方法就像“拨号”。

更新:检测无效 URL/不存在服务器的一种解决方法是在启动时使用 HTTP 客户端组件(Indy、Synapse),仅用于进行健康检查。将 WSDL URL 传递给它,然后尝试获取它。如果失败,您将知道服务器不可访问。

您还可以使用 Web 服务端点 URL(针对特定服务方法)执行 GET 或 POST。如果您使用 HTTP GET,许多 SOAP 服务器会以“方法不支持”之类的错误消息进行响应,但至少会有响应。

于 2012-12-19T09:43:21.353 回答