WSDLファイルでは、関数はTypeまたはElementを返すことができます。これまで、結果としてカスタムタイプのみを使用しました。しかし、要素はいつタイプよりも適切である必要があるのだろうか?それらの違いは何ですか?
間に違いはありますか
<wsdl:message name="MyFunction">
<wsdl:part name="parameters" element="tns:Person"></wsdl:part>
</wsdl:message>
そして
<wsdl:message name="MyFunction">
<wsdl:part name="parameters" type="tns:Person"></wsdl:part>
</wsdl:message>
クライアントの観点(Webサービスを使用するアプリケーション)から?
スカッフマンが指摘したように、上記の質問は別の質問につながります。違いは何ですか
<xs:element name="Person" ... >
...
</xs:element>
そして
<xs:complexType name="Person">
...
</xs:complexType>
?
それだけではありません。
相互運用性の問題を引き起こす可能性のある標準には、いくつかのあいまいさがあります。ドキュメントベースのサービスを使用しているか、RPCベースのサービスを使用しているかによって、タイプまたは要素を使用する必要があります。
あいまいさもあります。あなたが言うなら
<wsdl:message name="message1" type="ns:type1"/>
次に、メッセージのコンテンツは「ns:type1」タイプに対して検証する必要があると言いました。しかし、コンテンツを含む要素については何も言っていません。どの名前空間になりますか?
これに関するいくつかのルールについては、 WS-I Basic Profile を参照してください。
「document/literal」対「document/literal/wrapped」についてのコメントでいくつかの議論がありました。これが私の見解です。
Webサービスを作成しました。すべてがここにあります:
using System.Web.Services;
namespace WebService1
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class SimpleMathService : WebService
{
[WebMethod]
public int Add(int a, int b)
{
return a + b;
}
[WebMethod]
public int Multiply(int a, int b)
{
return a*b;
}
}
}
私はentireWSDLを投稿しませんが、ここに「良い部分」があります:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" >
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<s:element name="Add">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="a" type="s:int"/>
<s:element minOccurs="1" maxOccurs="1" name="b" type="s:int"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AddResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1"
name="AddResult" type="s:int"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="int" type="s:int"/>
</s:schema>
</wsdl:types>
<wsdl:message name="AddSoapIn">
<wsdl:part name="parameters" element="tns:Add"/>
</wsdl:message>
<wsdl:message name="AddSoapOut">
<wsdl:part name="parameters" element="tns:AddResponse"/>
</wsdl:message>
<wsdl:portType name="SimpleMathServiceSoap">
<wsdl:operation name="Add">
<wsdl:input message="tns:AddSoapIn"/>
<wsdl:output message="tns:AddSoapOut"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SimpleMathServiceSoap" type="tns:SimpleMathServiceSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Add">
<soap:operation soapAction="http://tempuri.org/Add" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SimpleMathService">
<wsdl:port name="SimpleMathServiceSoap" binding="tns:SimpleMathServiceSoap">
<soap:address location="http://localhost:5305/SimpleMathService.asmx"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Wordの「ラップ」が表示されないことに注意してください。文書内のIBMが「document/literal/wrapped」と呼んでいるものは、単純に「document/literal」であり、たった1つのメッセージ部分を使用し、サービスの名前から派生した名前を持ち、要素に追加します。この要素には、操作に対する両方のパラメータが含まれています。
ここには魔法のようなものは何もありません。ここには標準的でないものはありません。
多くの標準化団体では、企業が側になってしまいます。 SOAPの場合、「RPCサイド」と「ドキュメントサイド」があります。 RPCは多くの人に馴染みがあります-関数呼び出しで1対1にマップします。ドキュメントはあまり馴染みがなく、実際に単純なXMLの観点から考える必要があります。おそらくIBMがRPC側にいたのかどうかはわかりません。
これで、IBMドキュメントのWSDLのスタイルが完成しました。要約は次のとおりです。
4つのバインディングスタイルがあります(実際には5つありますが、ドキュメント/エンコードは意味がありません)。各スタイルには場所がありますが、ほとんどの場合、ドキュメント/リテラルラップが最適なスタイルです。
また、操作名がメッセージに含まれているかどうかに基づいて、ディスパッチの難易度を説明しているドキュメント内の場所に対応したいと思います。これは問題ではありません。このドキュメントを読むと、<binding>
セクション。 「操作名がない」問題の解決策があります。
<wsdl:binding name="SimpleMathServiceSoap" type="tns:SimpleMathServiceSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Add">
<soap:operation soapAction="http://tempuri.org/Add" style="document"/>
SoapActionはリクエストのHTTPヘッダーで送信され、ディスパッチに使用できます。
POST /SimpleMathService.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/Add"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Add xmlns="http://tempuri.org/">
<a>int</a>
<b>int</b>
</Add>
</soap:Body>
</soap:Envelope>
どちらを使用するかは、参照先のスキーマによって異なります。 tns:Personがスキーマで次のように定義されている場合:
<xs:element name="Person" ... >
...
</xs:element>
次に、使用します
<wsdl:part name="parameters" element="tns:Person">
一方、スキーマが次のように定義されている場合
<xs:complexType name="Person">
...
</xs:complexType>
次に使用します
<wsdl:part name="parameters" type="tns:Person">
ですから、実際の質問は、スキーマ要素とスキーマ型の違いは何なのかです。
質問のWSDL部分についてコメントすることはできませんが、XMLスキーマ部分には答えます。
<xs:complexType>
は、要素自体(つまりその名前)を記述することなく、要素のcontentを記述する型を定義します。 <xs:element>
はelement(具体的にはその名前)を記述しますが、タイプは記述しません。ただし、<xs:element>
always references記述する要素のコンテンツのタイプ。これは、スキーマの他の場所の既存の型(<xs:complexType>
を含むがこれに限定されない-<xs:simpleType>
など)への参照、またはインライン<xs:complexType>
定義:
<xs:element name="foo">
<xs:complexType>
...
</xs:complexType>
</xs:element>
上記の構成は非常に一般的であるため、実際には<xs:complexType>
を完全に省略することができ、暗黙的に示されます。
型を常に個別に定義してから要素宣言で参照するか、または要素宣言内で要素型をインラインで定義することを選択するかは、スタイルの問題です。
<xs:element name="person" type="persontype"/>
<xs:complexType name="persontype">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
type
属性の<element>
は、name
属性の<complexType>
を参照しています。
<wsdl:message name="MyFunction">
<wsdl:part name="parameters" element="tns:person"></wsdl:part>
</wsdl:message>
そして
<wsdl:message name="MyFunction">
<wsdl:part name="parameters" type="tns:person"></wsdl:part>
</wsdl:message>
<part>
パラメーターは、<types>
コンテナー要素で定義された具象型に関連付けられます。 <part>
は、上記のようにtype
属性による<complexType>
または要素属性による<element>
のいずれかを参照できます。<complexType>
または<portType>
、またはtype
属性によって参照される任意のいずれかです。