2

Delphi 2009 で作成した ISAPI DLL から始めました。このモジュールは、Windows XP の IIS 5.1 で実行すると期待どおりに動作します。Apache 2.2.15 と mod_isapi を使用してホストされている場合、この同じモジュールは正しく機能しません。mod_isapi に欠陥がある可能性を排除するために、同じサービスの Apache 共有オブジェクト モジュールが作成されました。ただし、Apache モジュールとしても同様の問題が発生します。

実装コードを共有する 2 つのプロジェクトを作成することで、同一の実装を持つ ISAPI DLL と Apache モジュールの両方を作成することができました。したがって、それらの唯一の違いは、ホスト Web サービスへの接続方法です。これにより、このサービスをホストするための 3 つのオプションが得られます。

  • IIS + ISAPI DLL
  • アパッチ + アパッチ モジュール
  • Apache + mod_isapi + ISAPI DLL。

どちらのプロジェクトも、テスト用に単純な Web SOAP サービスを実装しています。Delphi IDE を使用して新しい Soap Server アプリケーションを作成すると、すべてのシリアライゼーション、デシリアライゼーション、マーシャリングなどが自動生成コードによって処理されます。インターフェイスには、テスト用のいくつかの簡単な機能があります。

Apache モジュールを作成するには、次の手順に従う必要がありました。

SOAP サービスが実装するインターフェースは非常に単純です。さまざまなことをテストするためのいくつかのバリエーションがあります。

IPdiSvc2 = interface(IInvokable)
['{532DCDD7-D66B-4D2C-924E-2F389D3E0A74}']
  function Echo(data:string): string; stdcall;
  function SendFile1(request: TSendFileRequest; attachment: TSOAPAttachment):
    TSendFileResponse; stdcall;
  function SendFile2(request:string): TSendFileResponse; stdcall;
  function SendFile3():TSendFileResponse; stdcall;
  function SendFile4(attachment: TSoapAttachment): TSendFileResponse; stdcall;
  function SendFile5(request: TSendFileRequest):TSendFileResponse; stdcall;
end;

TSendFileRequest と TSendFileResponse も非常に単純です。

TSendFileRequest = class(TRemotable)
  private
    FFilename: string;
  published
    Property Filename: string read FFilename write FFilename;
end;

TSendFileResponse = class(TRemotable)
  private
    FFileID: Int64;
  published
    Property FileID: Int64 read FFileId write FFileID;
end;

インターフェイスの実装は、クライアントに送り返す結果オブジェクトを作成するだけのダミー コードでいっぱいです。実装に重要なコードはありません。

ISAPI を介して IIS でホストされている場合、サービスによって公開されているすべてのメソッドは完全に機能します。

Apache でホストされている場合、TRemotable パラメーターを含むメソッドにはエラーがあります。このインターフェイスでは、SendFile1 と SendFile5 が影響を受けます。これは、パラメーターとして TSendFileRequest があるためです。SendFile1 または SendFile5 への最初の呼び出しは期待どおりに機能します。SendFile1 または SendFile5 への呼び出しが成功した後、いずれかのメソッドを次に呼び出すと、アクセス違反が発生します。この動作は、Apache 共有オブジェクト モジュール、および mod_isapi を使用する ISAPI DLL の両方で観察されます。

どこに問題があるのか​​はわかりませんが、私のコード、Delphi コード、または Apache コードの 3 つの選択肢があります。どこにあるのかわかりません。

まったく同じバイナリ ISAPI DLL が IIS では機能するが Apache では機能しないため、この問題は非常にイライラさせられます。ISAPI ホストの実装の違いのせいだと思いますが、Apache 共有オブジェクト モジュールで同じ間違いが起こるということは、別のことが起こっていることを意味します。

完全を期すために、同じ Web サービスの CGI バージョンを作成することにしました。IIS で実行すると、CGI バージョンは完全に機能します。Apache で実行すると、すべての要求で次のエラーが発生します。「XML ドキュメントにはトップ レベルの要素が必要です。行: 0」

今日、アパッチは私を嫌っているようです。

4

1 に答える 1

-1

間違って呼び出しているかどうかを除外するには、SoapUI で WSDL を使用し、いくつかのテスト メッセージを送信します。それらが成功するかどうかを確認してください。SoapUI で動作する場合は、クライアント コードに問題があります。うまくいかない場合は、サーバー側の問題です。また、SoapUI が要求オブジェクトを予想とは異なる方法で構築するかどうかも確認してください。

于 2010-06-22T19:03:11.203 に答える