Last-modified: 2003-12-30 (火) 19:45:30 (7415d)
 

SOAPAction

 SOAPリクエストのHTTPヘッダにSOAPActionというフィールドがあるかないかが問題になることがあります。

 代表的な実装は、以下のような仕様になっています。

  • プロバイダ(サーバ)側
    • Apache Axis 1.1
      • WSDL内のSOAPActionは""(0 length)となる。
      • SOAPActionの無いリクエストはAxisFault(Client.NoSOAPAction)となる。
    • ASP.NET 1.1.4322
      • WSDL内のSOAPActionはURI({targetNamespace} + {operationName})となる。
  • リクエスタ(クライアント)側
    • Apache Axis 1.1
      • 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: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