3

WebService が利用可能かどうか、または有効な URL があるかどうかを確認するにはどうすればよいですか?

Delphi ウィザードを使用して、必要な WSDL 関数をインポートおよび自動生成しています。

ウィザードが作成した関数は例外をスローせず、WSDL または URL が間違っていても null オブジェクトを返しません。返された 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;

defWSDLorが無効または利用できない場合、初期化されたクラス/インターフェイスdefURLを返します。checkVatPortTypeその後、返されたインターフェイスで関数 ( ) を呼び出すとcheckVatPortType.checkVat、奇妙な例外が発生します。

つまり、WebService が利用できない場合、ユーザーは「XML-String に有効な "text/html" 形式がありません」というメッセージを受け取ります。これは問題を説明していません。

4

1 に答える 1

3

これは「設計どおり」です。Web サービスを呼び出すだけでネットワーク操作が発生し、その場合にのみネットワーク層が失敗または成功します。

Web サービス参照を作成することは電話を取ることに似ており、Web サービス メソッドを実行することは「ダイヤルする」ことに似ています。

更新: 無効な URL / 存在しないサーバーを検出する 1 つの回避策は、起動時に HTTP クライアント コンポーネント (Indy、Synapse) を使用して、ヘルス チェックのみを行うことです。それに WSDL URL を渡してから、GET を試みます。失敗した場合は、サーバーに到達できないことがわかります。

Web サービス エンドポイント URL (特定のサービス メソッド用) を使用して GET または POST を実行することもできます。HTTP GET を使用すると、多くの SOAP サーバーが「メソッドはサポートされていません」などのエラー メッセージで応答しますが、少なくとも応答はあります。

于 2012-12-19T09:43:21.353 に答える