|
*** SOAPAction #contents #br ** SOAPAction SOAPリクエストのHTTPヘッダにSOAPActionというフィールドがあるかないかが問題になることがあります。~ 代表的な実装は、以下のような仕様になっています。 -プロバイダ(サーバ)側 --[[Apache Axis 1.1:http://ws.apache.org/axis/]] ---WSDL内のSOAPActionは""(0 length)となる。 ---SOAPActionの無いリクエストはAxisFault(Client.NoSOAPAction)となる。 --ASP.NET 1.1.4322 ---WSDL内のSOAPActionはURI({targetNamespace} + {operationName})となる。 -リクエスタ(クライアント)側 --[[Apache Axis 1.1:http://ws.apache.org/axis/]] ---WSDLにSOAPActionの記述があれば、それをHTTPヘッダにつけてリクエストする。 ---WSDLにSOAPActionの記述が無ければ、""(0 length)のSOAPActionでリクエストする。 --ASP.NET 1.1.4322 ---WSDLにSOAPActionの記述があれば、それをHTTPヘッダにつけてリクエストする。 ---WSDLにSOAPActionの記述が無ければ、""(0 length)のSOAPActionでリクエストする。 --Microsoft SOAP Toolkit (WindowsXPに内包) ---WSDLにSOAPActionの記述があれば、それをHTTPヘッダにつけてリクエストする。 ---WSDLにSOAPActionの記述が無いか""(0 length)ならば、HTTPヘッダにSOAPActionフィールド無しでリクエストする。 上記の組み合わせのうち問題が発生するのは、Axis1.1とMicrosoft SOAP Toolkitです。 *** SOAP1.2 SOAP1.1仕様はかなり曖昧で、異なる実装の相互接続性に問題が生じたため、SOAP1.2の仕様は厳格になっています。SOAP1.2の主な変更点は以下の通り。 <HTTPプロトコルバインディングヘッダ関連> -''SOAPActionヘッダフィールドを削除'' -Content-Typeヘッダフィールドを" text/xml"から" application/soap+xml"に変更 -HTTP拡張フレームワークを削除 <SOAPエンベロープ関連> -''接頭辞:env'' -名前空間URL:http://www.w3.org/2002/06/soap-envelope -Body要素の後にどんな要素も許可しない <エンコーディングスタイル関連> -env:encodingStyle属性は、ヘッダブロックおよびその子孫要素、Body要素の子孫要素、Detail要素の子孫要素でのみ可能 <SOAPヘッダ関連> -env:NotUnderstood見出し要素を追加 -mustUnderstand属性値は"1"または"0"、あるいは"true"または"false" -env:actor属性をenv:role属性に変更(属性値に"none"と"ultimateReceiver"を追加) -env:relay属性を追加 <SOAPエンコーディング規則関連> -接頭辞:enc -名前空間URL:http://www.w3.org/2002/06/soap-encoding -フォルトコードDataEncodingUnknownを追加 -href属性をenc:ref属性に変更 -enc:nodeType属性を追加 -itemType属性でデータ型を、arraySize属性でデータ数を指定 -エラー用フォルトサブコードenc:MissingID、enc:UntypedValueを追加 <RPC表現規則関連> -接頭辞:rpc -名前空間URL:http://www.w3.org/2002/06/soap-rpc -rpc:result要素アクセサを追加 -フォルトコードを追加(rpc:ProcedureNotPresent、rpc:BadArguments) <その他> -フォルトコードで、"クライアント"と"サーバ"を"送信者"と"受信者"に変更 -faultcodeをenv:Codeに、faultstringをenvReasonに変更 -env:Reason要素は、xml:lang属性を持ち、複数のenv:Text子要素を持てる -env:Node要素env:Roleと要素を追加 -env:Details要素の有無はエラーの発生場所と関係がない -相対的URL参照の基底URIを判別するのにXML Baseを利用する *** Apache Axis1.1の実装 ''Axis1.1はSOAP1.2準拠ではない''ということです。 Javaのクラスを適当に作って %java org.apache.axis.wsdl.Java2WSDL -T 1.2 -A OPERATION -y DOCUMENT -l http://localhost:8080/axis/services/Test test.Test としてwsdlファイルを作り、 %java org.apache.axis.wsdl.WSDL2Java -s -T 1.2 -t Test.wsdl としてサーバ側およびテストクライアントを作成し、 %java org.apache.axis.client.AdminClient -l http://localhost:8080/axis/servlet/AxisServlet deploy.wsdd としてDeployしたWebサービスのプロトコルログを見ても、 POST /axis/services/Test HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/1.1 Host: localhost:8080 Cache-Control: no-cache Pragma: no-cache SOAPAction: "helloWorld" Content-Length: 303 <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <helloWorld xmlns="http://test"/> </soapenv:Body> </soapenv:Envelope> HTTP/1.1 200 OK Content-Type: text/xml;charset=utf-8 Date: Sun, 04 Jan 2004 16:11:01 GMT Server: Apache-Coyote/1.1 Connection: close <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <helloWorldReturn xmlns="http://test">こんにちは、世界</helloWorldReturn> </soapenv:Body> </soapenv:Envelope> という具合になります。パッと見ただけでも -Content-Typeが application/soap+xml になってない。 -接頭辞が enc になってない。 また、 -リクエストのHTTPヘッダにSOAPActionがないと、やっぱりAxisFaultになる。 ということです。それとも、他に何か設定が?(^^;;~ 現在Alpha版のAxis1.2からこの辺が改良されるのかな?