17

Visual Studio 2008(SP1)で[サービス参照の追加]を使用して特定のサービスをインポートすると、すべての要求/応答メッセージが不必要にメッセージコントラクトにラップされます(名前は-> "operationName" + "Request" / "Response" +最後に「1」)。

コードジェネレーターによると:

// CODEGEN: Generating message contract since the operation XXX is neither RPC nor 
// document wrapped.

Javaサービスからwsdlを生成している人は、DOCUMENT-LITERAL/WRAPPEDを指定していると言います。

ヘルプ/ポインタ/手がかりをいただければ幸いです。

更新:これは、疑わしいと思われる操作の1つに対する私のwsdlのサンプルです。応答と比較して、要求のメッセージ要素属性の不一致に注意してください。

<!- imports namespaces and defines elements -->
<wsdl:types>
  <xsd:schema targetNamespace="http://WHATEVER/" xmlns:xsd_1="http://WHATEVER_1/" xmlns:xsd_2="http://WHATEVER_2/">
      <xsd:import namespace="http://WHATEVER_1/" schemaLocation="WHATEVER_1.xsd"/>
      <xsd:import namespace="http://WHATEVER_2/" schemaLocation="WHATEVER_2.xsd"/>
      <xsd:element name="myOperationResponse" type="xsd_1:MyOperationResponse"/>
      <xsd:element name="myOperation" type="xsd_1:MyOperationRequest"/>
   </xsd:schema>
</wsdl:types>

<!- declares messages - NOTE the mismatch on the request element attribute compared to response -->
<wsdl:message name="myOperationRequest">
   <wsdl:part element="tns:myOperation" name="request"/>
</wsdl:message>
<wsdl:message name="myOperationResponse">
   <wsdl:part element="tns:myOperationResponse" name="response"/>
</wsdl:message>

<!- operations -->
<wsdl:portType name="MyService">
   <wsdl:operation name="myOperation">
      <wsdl:input message="tns:myOperationRequest"/>
      <wsdl:output message="tns:myOperationResponse"/>
      <wsdl:fault message="tns:myOperationFault" name="myOperationFault"/>
      <wsdl:fault message="tns:myOperationFault1" name="myOperationFault1"/>
   </wsdl:operation>
</wsdl:portType>

更新2:インポートによってメッセージコントラクトの生成がトリガーされる可能性があるため、インポートした名前空間(別のxsdにある)にあるすべてのタイプをwsdlにプルしました。驚いたことに、そうではなく、wsdlですべての型を定義しても何も変わりませんでした。

次に、(必死になって)wsdlを最初から作成maxOccursし、シーケンス属性に含まれる要素属性の属性で遊んで、望ましくないメッセージコントラクト生成の動作を再現することができました。

要素のサンプルは次のとおりです。

<xsd:element name="myElement">
   <xsd:complexType>
      <xsd:sequence>
         <xsd:element minOccurs="0" maxOccurs="1" name="arg1" type="xsd:string"/>
      </xsd:sequence>
   </xsd:complexType>
</xsd:element>

maxOccursメッセージとして使用される要素(基本的にすべての要求と応答)で遊ぶと、次のことが起こります。

  • maxOccurs="1"はラッピングをトリガーしません
  • macOcccurs> 1は、ラッピングをトリガーします
  • maxOccurs="unbounded"はラッピングをトリガーします

タイプのネストが非常に深くなるため、これを本番環境のwsdlでまだ再現できませんでした。これを徹底的に調べるには、時間がかかります。その間、私はそれがベルを鳴らすかもしれないことを望んでいます-どんな助けでも高く評価されます。

4

5 に答える 5

5

私はこれと同じ問題を抱えていましたが、これで解決しました。

私はこれを使用しました:

    <wsdl:message name="Method">
      <wsdl:part name="parameters" element="s0:Method"/>
    </wsdl:message>

    <wsdl:message name="MethodResponse">
      <wsdl:part name="parameters" element="s0:MethodResponse"/>
    </wsdl:message>

それ以外の:

    <wsdl:message name="Method">
      <wsdl:part name="request" element="s0:Method"/>
    </wsdl:message>

    <wsdl:message name="MethodResponse">
      <wsdl:part name="response" element="s0:MethodResponse"/>
    </wsdl:message>

誰かが以前に言及したと思いますが、まだ彼らの答えに賛成票を投じることはできません!

于 2013-08-15T14:30:38.590 に答える
4

確認する別の項目は次のとおりです。

  1. ソリューション エクスプローラーでサービス参照を右クリックし、[サービス参照の構成] を選択します。

  2. 「常にメッセージ コントラクトを生成する」がチェックされているかどうかを確認します。

于 2010-03-12T05:09:53.370 に答える
2

scvutil Goto --> Startmenu / Visual Studio 2008 / Tools / VS Command Prompt を使用してみましたか

svcutil と入力し、パラメーター、特に /wrapped パラメーターを確認します。最終的にこれを使用してプロキシを生成します。これにより、何が起こっているかをより詳細に制御できます

于 2010-03-04T13:11:23.197 に答える
2

これがかなり古いエントリであることは承知していますが、同じ問題に遭遇した人のために:

生成されたプロキシにギザギザの配列が含まれていないことを再確認してください。

(C#)

private string[][] mystring;

(VB.NET)

Private myString()() As String
于 2011-04-07T20:14:07.887 に答える