2

複合型を受け入れる操作を定義するWSDLがあるとしましょう。これは、次のような非常に一般的なWebメソッドのものです。

  <xs:element name="createBill">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="customer" nillable="true" type="xs:string" />
        <xs:element minOccurs="0" name="billId"   nillable="true" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <wsdl:message name="createBillRequest">
    <wsdl:part name="parameters" element="ns:createBill" />
  </wsdl:message>

  <wsdl:operation name="creatBill">
    <wsdl:input wsaw:Action="urn:createBill" message="axis2:createBillRequest" />
    ...
  </wsdl:operation>

2つの異なる呼び出しのWebServices標準実装ルールは何ですか。1つはbillIdを指定し、もう1つxsi:nilはノードを完全に省略しますか?

<creatBill ...>
   <customer>1332400</customer>
   <billId xsi:nil="true"/>
</createBill>

vs

<creatBill ...>
   <customer>1332400</customer>
</createBill>

より多くの背景を明らかにするために、私は1人のJavaの人に問題があります。彼のWebサービスはAxis2で行われ、(私には奇妙な理由で)bill要素の省略をnil値とは異なる方法で処理します。私の主張は、それらは同一であり、どちらの場合も同じように動作する必要があるということです(たとえば、動的なbillIDを作成します)。彼の主張は、それは同じではなく、ノードが欠落している場合にのみ動的IDを生成し、そうでない場合はノードがnillされたときにエラー(「billId欠落」)を返すというものです。

彼の主張で私が抱えている実際的な問題は、.NETのWCFスタックとWSスタックの両方がこれらを同じものとして扱い、nillableパラメーターを省略するためのプロビジョニングさえ行わないため、自分の書き込みなしでクライアントを実装することは事実上不可能です。独自のWSスタックと、彼が実装するWS-Security。現状では、nullを指定してサービスを呼び出すことしかできません。

serv.createBill("1332400", null);
serv.createBill("1332400"); // ERROR: no such method

彼がJavaでサーバー側を実装して、1つのWebメソッドが異なる呼び出しパターンを持つようにした方法さえわかりません。ノードが省略されたときにAxis2によって設定されるbillIDパラメーターは何ですか?彼は非常に非協力的であり、彼らがサポート契約を結んでいるので、彼に、そして後で彼のマネージャーに提示するためにいくつかの議論が必要です(もしあれば)。

私たち両方が正しいわけではないので、WS標準がここで何を規定しているのか誰かが知っていますか?誰が基準に責任がありますか?私はwcfvsaxis Flameを開始していません(ご遠慮ください)。両方の親として、SOAP/WSDL標準と仕様の観点からこの問題を検討する必要があります。

4

2 に答える 2

3

Web サービスは document/literal スタイルを使用しています。その場合、Web サービスの仕様では、メッセージの内容 (具体的には SOAP 本体の単一の子) が XML スキーマ要素宣言によって記述されていること、そしてもちろんその宣言に準拠していることだけが要求されます。現在、XML スキーマでは確かに minOccurs="0" と nillable="true" を同時に使用できますが、仕様では、要素が存在しないことと xsi:nil="true" を含む要素が存在することには特に意味がありません。 "; 特に、これら 2 つのケースが同等であると宣言していません。これら 2 つのケースの意味を定義するのは、スキーマの設計者次第です。

また、WSDL とスキーマを言語固有の構造に変換する方法を説明する普遍的な標準がないことにも注意してください。

そうは言っても、minOccurs="0" と nillable="true" を一緒に使用すると問題が発生します。ほとんどの言語には、値の不在を表す単一の概念、つまり null 値しかないためです。要素が minOccurs="0" または nillable="true" で宣言されている場合、null 値の使用はうまく機能しますが、両方で宣言された要素を処理する自然な方法はありません。JAX-WS 仕様は、次の質問で説明されているように、この問題に対処しています。

Jaxb によって生成されたクラスは、指定された型の代わりに JAXBElement を使用しました

JAX-WS とは対照的に、他の言語固有の Web サービス バインディング規則の中には、この問題に適切に対処していないものもあり、minOccurs="0" を nillable="true" と一緒に使用すると、相互運用性の問題が発生することがよくあります。したがって、これは悪い習慣と見なされるべきですが、残念ながら Web サービスの仕様にはこれを禁止するものは何もありません。

于 2012-09-06T09:35:35.097 に答える
0

Axis サービスが null 許容値に関する一部の WS 標準に準拠しているかどうかはわかりませんが、DataMember 属性の EmitDefaultValue 設定を設定することで、WCF クライアント生成コードを微調整できる場合があります。false に設定すると、サービスが探しているように見える null 許容型の値が null の場合、WCF は対応する XML 要素を作成しません。

于 2012-09-05T12:29:47.397 に答える