*** 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からこの辺が改良されるのかな?


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS