- PR -

[WebMethod] attribute と element

投稿者投稿内容
ひざらがい
会議室デビュー日: 2001/10/13
投稿数: 6
投稿日時: 2002-01-15 21:11
また、日を置いて失礼します。
お約束していた、SOAP および UDDI 仕様上の xml attribute の扱いについてです。

その前に、直前の投稿、一ヶ所間違っています。soap;Environment ではなくて soap:Envelope です。これまた失礼しました。
修正のできる掲示板ですが、戒めの意味も含めまして、そのままにして置きます。


ここから本題です。

SOAP V.1.2 仕様では、SOAP Body 以下のデータ構成については、何も強制してはいません。xml element で始まる xml 文書であるならば、何でも可です(パート1第4章)。しかしそれでは、あまりにも基準が無さ過ぎるので、RPC 型の呼び出しで使うのに便利な SOAP Encoding というものを定義しています(パート2第4章)。

.NET の実装も、Apache の実装も、取り立ててオプション設定をしなければ、この SOAP Encoding を使って、xml シリアライズ/デシリアライズを行います。

SOAP V.1.2 仕様 パート2第4章第1節のシリアライズ規則第1項には、以下の記述があります。

  1. All values are represented as element content.

SOAP Body 中のデータ構成に SOAP Encoding を採用する限り、値の表現に xml attribute は使えません。この点では、.NET の実装は、仕様に忠実であると言えます。(ただし、SOAP Encoding を利用しないオプションでも、これを適用してしまうようですが。)


では、SOAP を実際の XML 化に使用するとされる UDDI は、いったいどうしているのでしょうか。

UDDI V.2 API 仕様 第6章(付録B)には、UDDI における SOAP 適用範囲が語られています。その中で、第3節には以下の記述があります。

  In UDDI version 1.0 and version 2.0, the SOAP encoding feature
  is not supported. Operator Sites will reject any request that
  arrives with a SOAP encoding attribute with an error code of
  E_unsupported.

UDDI V.2 API の SOAP Body 以下は、SOAP Encoding を採用してはいません。言うなれば、UDDI Encoding を規定しています。最初に書きましたとおり、SOAP Body 配下のデータ構成に SOAP の強制力は無いので、これでも SOAP を利用していると喧伝することは可能です。

なので、SOAP Body 配下にありながらも、xml attribute を使って値を示すこと(find_business の maxRows など)は、まったく正当なことであり、非難される部分はありません。

また、UDDI V.2 としては、SOAP Header の使用も想定していないので(第5節)、UDDI で使用する SOAP は、SOAP Envelope と、SOAP Body の皮、SOAP Fault だけになります。(SOAP Header を独自の拡張として使用することは可能です。ただし、自分以外のサービス/クライアントが解釈できるとは限りません。)


結局なにが言いたいかというと「下地が SOAP であると記載されていても、安直には扱えない。」ということです。

--
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-01-16 10:44
引用:

ひざらがいさんの書き込み (2002-01-15 21:11) より:
.NET の実装も、Apache の実装も、取り立ててオプション設定をしなければ、この SOAP Encoding を使って、xml シリアライズ/デシリアライズを行います。



これは違います。ASP.NETはデフォルトではSOAP Encoding(a.k.a Section 5)は使いません。SOAP Encodingを使うなら、[SoapRpcMethod]などを明示的に指定しなければなりません。.NET Remoting+SOAPではSOAP Encodingを利用します。もっともそれだけではありませんが。これは、ASP.NETはSystem.Xml.Serializationを、.NET RemotingはSystem.Runtime.Serializationを、それぞれシリアライズに使うが故の違いです。

引用:

ひざらがいさんの書き込み (2002-01-15 21:11) より:
SOAP Body 中のデータ構成に SOAP Encoding を採用する限り、値の表現に xml attribute は使えません。この点では、.NET の実装は、仕様に忠実であると言えます。(ただし、SOAP Encoding を利用しないオプションでも、これを適用してしまうようですが。)



SOAP Encodingを利用しない場合、どんなEncoding方式をとるかは自由です。ですから、属性を許さない、でもSOAP Encodingではない、という方式もまったく問題ありません。

引用:

ひざらがいさんの書き込み (2002-01-15 21:11) より:
結局なにが言いたいかというと「下地が SOAP であると記載されていても、安直には扱えない。」ということです。



SOAPは、単なる転送プロトコルです。ですから、SOAPを利用している、と聞いたときに、受ける側が合理的に持つことができる仮定は、SOAP Envelopeに関する仕様だけです。SOAP Encodingを利用しているかどうかは、encodingStyle属性を見てみなければわかりません。UDDIはそれを使わないで、代わりにBodyの中にXMLフォーマットの文書を送受信します。このスタイルは、(WSDLの定義から)document/literalなどと呼ばれ、SOAP Encodingよりも主流派となりつつあります。つまり、XSDで定義したスキーマを交換して、そのスキーマのインスタンスをSOAPで運ぶというイメージです。

スキルアップ/キャリアアップ(JOB@IT)