3

シンプルな WCF テスト SOAP アプリケーションを生成してみました。デバッガーで起動すると、ブラウザーが開き、サービス ページが表示されます。そのページには wsdl ( http://.../MyService?wsdl) へのリンクがあります。そのページに移動すると、次のように表示されます。

<wsdl:definitions name="MyService" targetNamespace="http://mynamespace.com/">
  <wsdl:types>
    <xsd:schema targetNamespace="http://mynamespace.com/Imports">
      <xsd:import schemaLocation="http://localhost:59315/MyService.svc?xsd=xsd0" namespace="http://mynamespace.com/"/>
      <xsd:import schemaLocation="http://localhost:59315/MyService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
      <xsd:import schemaLocation="http://localhost:59315/MyService.svc?xsd=xsd2" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
      <xsd:import schemaLocation="http://localhost:59315/MyService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/My.Service"/>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="IMyService_testConnection_InputMessage">
    <wsdl:part name="parameters" element="tns:testConnection"/>
  </wsdl:message>
  <wsdl:message name="IMyService_testConnection_OutputMessage">
    <wsdl:part name="parameters" element="tns:testConnectionResponse"/>
  </wsdl:message>
  <wsdl:message name="IMyService_testAction_InputMessage">
    <wsdl:part name="parameters" element="tns:testAction"/>
  </wsdl:message>
  <wsdl:message name="IMyService_testAction_OutputMessage">
    <wsdl:part name="parameters" element="tns:testActionResponse"/>
  </wsdl:message>
  <wsdl:portType name="IMyService">
    <wsdl:operation name="testConnection">
      <wsdl:input wsaw:Action="http://mynamespace.com/IMyService/testConnection" message="tns:IMyService_testConnection_InputMessage"/>
      <wsdl:output wsaw:Action="http://mynamespace.com/IMyService/testConnectionResponse" message="tns:IMyService_testConnection_OutputMessage"/>
    </wsdl:operation>
    <wsdl:operation name="testAction">
      <wsdl:input wsaw:Action="http://mynamespace.com/IMyService/testAction" message="tns:IMyService_testAction_InputMessage"/>
      <wsdl:output wsaw:Action="http://mynamespace.com/IMyService/testActionResponse" message="tns:IMyService_testAction_OutputMessage"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="BasicHttpBinding_IMyService" type="tns:IMyService">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="testConnection">
      <soap:operation soapAction="http://mynamespace.com/IMyService/testConnection" style="document"/>
      <wsdl:input>
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="testAction">
      <soap:operation soapAction="http://mynamespace.com/IMyService/testAction" 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="MyService">
    <wsdl:port name="BasicHttpBinding_IMyService" binding="tns:BasicHttpBinding_IMyService">
      <soap:address location="http://localhost:59315/MyService.svc"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

すべてのプレフィックスをスキーマにマッピングする xmlns 定義はどこにありますか?

より具体的には、私のtestAction操作は 2 つDateTimeのオブジェクトとList<int>. リンクされた xsd を掘り下げると、次のようになります。

<xs:schema elementFormDefault="qualified" targetNamespace="http://rosscountgenerator.com/">
  <xs:import schemaLocation="http://localhost:59315/MyService.svc?xsd=xsd2" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
  <xs:import schemaLocation="http://localhost:59315/MyService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/My.Service"/>
  <xs:element name="testConnection">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="value" type="xs:int"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="testConnectionResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="testConnectionResult" nillable="true" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="testAction">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="startDate" type="xs:dateTime"/>
        <xs:element minOccurs="0" name="endDate" type="xs:dateTime"/>
        <xs:element minOccurs="0" name="storeIds" nillable="true" type="q1:ArrayOfint"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="testActionResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="testActionResult" nillable="true" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

List<int>my storeIdsのタイプは ですq1:ArrayOfint。しかし、やはりマッピングはありません。詳しく見てみると、http://schemas.microsoft.com/2003/10/Serialization/Arraysスキーマが実際には正しいスキーマであると推測でき、その xsd を見ると、次のようになります。

<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <xs:complexType name="ArrayOfint">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="int" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="ArrayOfint" nillable="true" type="tns:ArrayOfint"/>
</xs:schema>

適切な場所のようです。しかし、リクエストを開始しようとすると:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:msarray="http://schemas.microsoft.com/2003/10/Serialization/Arrays" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="http://mynamespace.com/" 
    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <my:testAction>
      <my:startDate xsi:type="xsd:dateTime">2012-09-01T00:00:00</my:startDate>
      <my:endDate xsi:type="xsd:dateTime">2012-09-15T00:00:00</my:endDate>
      <msarray:storeIds xmlns:msarray="http://schemas.microsoft.com/2003/10/Serialization/Arrays" 
           soapenc:arrayType="xsd:int[2]" 
           xsi:type="msarray:ArrayOfint">
        <int xsi:type="xsd:int">1</int>
        <int xsi:type="xsd:int">2</int>
      </msarray:storeIds>
    </my:testAction>
  </soap:Body>
</soap:Envelope>

2 つの日付は正常に取得されますが、storeIds ( List<int>) は null です。

xmlnsすべてのマッピングを含み、これらすべてを含む別のファイルはありますか? もしそうなら、どこでそれを見つけることができますか? また、リストが実際に null として逆シリアル化される理由がわかっている場合は、ヒントをいただければ幸いです。

- - - - - - - - - - アップデート - - - - - - - - - - - -

私の特定の問題では、配列自体にmy名前空間を付ける必要があり、配列の要素にmsarrayプレフィックスを付けて名前空間を付ける必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:msarray="http://schemas.microsoft.com/2003/10/Serialization/Arrays" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="http://mynamespace.com/" 
    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <my:testAction>
      <my:startDate xsi:type="xsd:dateTime">2012-09-01T00:00:00</my:startDate>
      <my:endDate xsi:type="xsd:dateTime">2012-09-15T00:00:00</my:endDate>
      <my:storeIds xmlns:msarray="http://schemas.microsoft.com/2003/10/Serialization/Arrays" 
           soapenc:arrayType="xsd:int[2]" 
           xsi:type="msarray:ArrayOfint">
        <msarray:int xsi:type="xsd:int">1</int>
        <msarray:int xsi:type="xsd:int">2</int>
      </my:storeIds>
    </my:testAction>
  </soap:Body>
</soap:Envelope>

今はうまくいきますが、私の一般的な質問はまだ残っています。xmlns 宣言はどこにありますか? ところで、wsdl を解析するための不可欠なツールであるsoapUIに再び感謝します。

4

0 に答える 0