ASP.NET
WebサービスをSOAPクライアントからASPで呼び出す際のデフォルトネームスペース問題の解決方法
ASP.NET
Webサービスを扱う際、クラシックASP
からこれらのサービスを呼び出すと、特にXMLネームスペースに関して予期しない動作が発生することがあります。これは、レガシーASP
アプリケーションを最新のASP.NET
サービスに統合しようとしているプロジェクトの途中では特に苛立たしいものです。
このブログ記事では、特定の問題、すなわちSOAPクライアントを使用してASP.NET
Webサービスと通信する際のデフォルトネームスペース問題への対処方法について説明します。詳細を見ていきましょう。
問題の理解
ASP.NET
で定義されたWebサービスがXMLメッセージを処理する場合を想像してください。このサービスをクラシックASP
コードからSOAPクライアントを使用して呼び出すと、何か奇妙なことに気づくかもしれません。ProcessMessage
メソッドに到達したXMLには、予期しないデフォルトネームスペースが付加されており、これが期待されるXML構造を変更するため、処理エラーを引き起こす可能性があります。
簡単に言うと、次のようなことが起きます:
- 期待されるXML構造:Webサービスは、付加されたデフォルトネームスペースのないXMLメッセージを期待しています。
- 実際に送信されるXML:SOAPClientはXMLメッセージをデフォルトネームスペースでラップしているため、サーバー側のメソッドでメッセージを処理する際に問題が発生します。
次のスニペットは、XMLメッセージの両方のバージョンを示しています:
-
SOAPClientからのXML:
<request xmlns="http://internalservice.net/messageprocessing"> <task>....various xml</task> </request>
-
期待されるXML:
<request> <task>....various xml</task> </request>
この不一致は、実行中に混乱と多くのエラーを引き起こす可能性があります。
解決策
幸いなことに、COM呼び出し可能な新しい.NETプロキシを作成するよりも簡単な修正があります。Webサービスに送信する前にASP
コードでXMLメッセージを構築する方法を少し調整するだけで済みます。
ステップ1:XMLメッセージを修正
トリックは、ネームスペースなしでXMLを明示的に定義するか、空のデフォルトネームスペースを使用することです。以下のように実行できます:
-
XMLメッセージを作成:XMLメッセージを構築する際に、デフォルトネームスペースを空文字列に設定します。この方法は、基本的にSOAPClientの動作をオーバーライドします。
XMLメッセージを構築するために更新されたコード行は次のとおりです:
xmlMessage = "<request xmlns=''><task>....various xml</task></request>"
ステップ2:更新されたXMLを送信
修正されたxmlMessage
を使用して、元のコードでWebサービスを呼び出し続けます。完全な呼び出しは次のようになります:
provWSDL = "http://servername:12011/MessageProcessor.asmx?wsdl"
Set service = CreateObject("MSSOAP.SoapClient30")
service.ClientProperty("ServerHTTPRequest") = True
Call service.MSSoapInit(provWSDL)
xmlMessage = "<request xmlns=''><task>....various xml</task></request>"
result = service.ProcessMessage(xmlMessage)
なぜこれが機能するのか
xmlns=''
を指定することで、SOAPクライアントに<request>
要素にデフォルトネームスペースを適用しないように指示します。これにより、あなたのXMLは、ASP.NET Webサービスが不必要な複雑さを加えることなく処理できる形式で送信されることが保証されます。
結論
クラシックASP
とASP.NET
Webサービスの統合を進めるのは挑戦的ですが、特にXMLネームスペースとSOAPメッセージングを扱うときにそう感じることがあるでしょう。XMLメッセージの構築方法を調整するだけで、Webサービスとのインタラクションをよりスムーズにし、潜在的な落とし穴を避けることができます。
今後同様の問題に直面した際には、ネームスペースの取り扱いについて確認し、必要に応じてXMLを調整してみてください。楽しいコーディングを!