1

.asmx ファイルを指すアプリケーションのサービス参照として設定された Soap WSDL があります。レスポンス ソープ エンベロープに問題があります。受信コードで作成されたときに値が存在するコレクションオブジェクトがあります。ソープ エンベロープがメモリ ストリームになり、呼び出し元のクライアントに送り返されようとしているところまでコードを進めると、コレクションに値が入力されます。ただし、もう一度 F10 を押すと、空のコレクションで呼び出し元のクライアントに戻ります。

私が使用しているクラスの WSDL は次のとおりです。

     <complexType name="Step">
    <complexContent>
      <extension base="tns:APIObject">
        <sequence>
          <element name="StepType" minOccurs="0" maxOccurs="1" type="xsd:string" />
          <element name="Name" minOccurs="0" maxOccurs="1" type="xsd:string" />
          <element name="Description" minOccurs="0" maxOccurs="1" type="xsd:string" />
          <element name="Automation" minOccurs="0" type="tns:Automation" />
          <element name="Sequence" minOccurs="0" type="xsd:int" />
          <element name="Activities" minOccurs="0" maxOccurs="1">
            <complexType>
              <sequence>
                <element name="Activity" type="tns:AutomationActivity" minOccurs="0"    maxOccurs="unbounded" />
              </sequence>
            </complexType>
          </element>
        </sequence>
      </extension>
    </complexContent>
  </complexType>
  <complexType name="StepInstance">
    <complexContent>
      <extension base="tns:Step">
        <sequence>
          <element name="StepDefinition" type="tns:Step" minOccurs="0" />
          <element name="AutomationInstance" type="tns:AutomationInstance" minOccurs="0" />
          <element name="ActivityInstances" minOccurs="0">
            <complexType>
              <sequence>
                <element name="ActivityInstance" type="tns:AutomationActivityInstance" minOccurs="0" maxOccurs="unbounded" />
              </sequence>
            </complexType>
          </element>
        </sequence>
      </extension>
    </complexContent>
  </complexType>
  <complexType name="AutomationActivity">
    <complexContent>
      <extension base="tns:APIObject">
        <sequence>
          <element name="Name" minOccurs="0" maxOccurs="1" type="xsd:string" />
          <element name="Description" minOccurs="0" maxOccurs="1" type="xsd:string" />
          <element name="IsActive" minOccurs="0" maxOccurs="1" type="xsd:boolean" />
          <element name="Definition" minOccurs="0" maxOccurs="1" type="tns:APIObject" />
          <element name="Automation" minOccurs="0" type="tns:Automation" />
          <element name="Step" minOccurs="0" type="tns:Step" />
          <element name="Sequence" minOccurs="0" type="xsd:int" />
          <element name="ActivityObject" minOccurs="0" type="tns:APIObject" />
        </sequence>
      </extension>
    </complexContent>
  </complexType>
  <complexType name="AutomationActivityInstance">
    <complexContent>
      <extension base="tns:AutomationActivity">
        <sequence>
          <element name="ActivityID" type="xsd:string" minOccurs="0" maxOccurs="1"></element>
          <element name="AutomationID" minOccurs="0" maxOccurs="1" type="xsd:string" />
          <element name="SequenceID" minOccurs="0" maxOccurs="1" type="xsd:int" />
          <element name="Status" minOccurs="0" maxOccurs="1" type="xsd:int" />
          <element name="StatusLastUpdate" minOccurs="0" maxOccurs="1" type="xsd:dateTime" />
          <element name="StatusMessage" type="xsd:string" minOccurs="0" />
          <element name="ActivityDefinition" type="tns:AutomationActivity" minOccurs="0" />
          <element name="AutomationInstance" type="tns:AutomationInstance" minOccurs="0" />
          <element name="StepInstance" type="tns:StepInstance" minOccurs="0" />
          <element name="ScheduledTime" minOccurs="0" maxOccurs="1" type="xsd:dateTime" />
          <element name="StartTime" minOccurs="0" maxOccurs="1" type="xsd:dateTime" />
          <element name="CompletedTime" minOccurs="0" maxOccurs="1" type="xsd:dateTime" />
        </sequence>
      </extension>
    </complexContent>
  </complexType>

これは、シリアライゼーションと MemoryStream への変換前の応答 Envelop です。

    <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<RetrieveResponseMsg xmlns="">   <OverallStatus>MoreDataAvailable</OverallStatus>
<RequestID>0216f0bb-9d4a-455f-8517-5856f2e6f65d</RequestID>
<Results xsi:type="AutomationInstance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<PartnerKey xsi:nil="true" />
<CreatedDate>2013-01-11T12:18:20.453</CreatedDate>
<ModifiedDate>2013-01-11T12:18:25.27</ModifiedDate>
<ObjectID xsi:nil="true" />
<CustomerKey>0aeb9113-14ac-f480-cb35-efaf4439dd34</CustomerKey>
<IsPlatformObject>true</IsPlatformObject>
<Name></Name>
<Description/>
<InteractionObjectID>7c9a50f8-645d-48f2-a023-9aea4a31e294</InteractionObjectID>
<IsActive>false</IsActive>
<ScheduledTime>2013-01-11T12:01:53.543</ScheduledTime>
<AutomationID>7c9a50f8-645d-48f2-a023-9aea4a31e294</AutomationID>
<StepInstances>
    <StepInstance>
        <PartnerKey xsi:nil="true" />
        <ObjectID xsi:nil="true" />
        <StepDefinition>
            <PartnerKey xsi:nil="true" />
            <ObjectID xsi:nil="true" />
            <Name />
            <Description />
            <Sequence>0</Sequence>
            <Activities><Activity>
            <PartnerKeyxsi:nil="true"/>
            <PartnerProperties>     
                <Name>PartnerApiObjectTypeId</Name>  <Value>42</Value>  </PartnerProperties>
            <CreatedDate>2013-01-11T12:00:20.767</CreatedDate>
            <ObjectID>9e34164a-5089-4fe3-aee3-33f0a472de6f</ObjectID>
            <CustomerKey>ebf044ef-8266-433f-b424-cc0aeb3735bd</CustomerKey>
            <Name>test</Name>
            <Description />
            <IsActive>true</IsActive>
            </Activity></Activities>
        </StepDefinition>
    </StepInstance>
</StepInstances>
<StartTime>2013-01-11T12:18:20.447</StartTime>
<CompletedTime>2013-01-11T12:18:25.27</CompletedTime>
</Results>
</RetrieveResponseMsg>
    </soap:Body>

StepInstances は、私の問題に焦点を当てたコレクションです。ご覧のとおり、期待どおりに入力されています。

これは、エンベロープに変換された MemoryStream です。

    <?xml version=\"1.0\" encoding=\"utf-8\"?>
<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">    
<soap:Header>                           <wsa:Action>RetrieveResponse</wsa:Action>
<wsa:MessageID>urn:uuid:a470ddfb-e032-4291-90e2-ce8ffb2b6a12</wsa:MessageID>
<wsa:RelatesTo>urn:uuid:4b5f3202-2207-4691-b33c-36f8a8ff799f</wsa:RelatesTo>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
<wsse:Security>     
<wsu:Timestampwsu:Id=\"Timestamp-4464e3e0-c473-45e8-865f-21b8a0134927\">
<wsu:Created>2013-01-16T22:04:18Z</wsu:Created>
<wsu:Expires>2013-01-16T22:09:18Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</soap:Header>
<soap:Body>
<RetrieveResponseMsg xmlns=\"">
<OverallStatus>MoreDataAvailable</OverallStatus>
<RequestID>e25b58e1-5ad7-4cf6-862b-429354f92aca</RequestID>
<Results xsi:type=\"AutomationInstance\">
<PartnerKey xsi:nil=\"true\" />
<CreatedDate>2013-01-11T12:18:20.453</CreatedDate>
<ModifiedDate>2013-01-11T12:18:25.27</ModifiedDate>
<ObjectID xsi:nil=\"true\" />
<CustomerKey>0aeb9113-14ac-f480-cb35-efaf4439dd34</CustomerKey>
<IsPlatformObject>true</IsPlatformObject>
<Name></Name>
<Description/>
<InteractionObjectID>7c9a50f8-645d-48f2-a023-9aea4a31e294</InteractionObjectID>
<IsActive>false</IsActive>
<ScheduledTime>2013-01-11T12:01:53.543</ScheduledTime>
<AutomationID>7c9a50f8-645d-48f2-a023-9aea4a31e294</AutomationID>
<StepInstances>
    <StepInstance>
        <PartnerKey xsi:nil=\"true\" />
        <ObjectID xsi:nil=\"true\" />
        <StepDefinition>
            <PartnerKey xsi:nil=\"true\" />
            <ObjectID xsi:nil=\"true\" />
            <Name />
            <Description />
            <Sequence>0</Sequence>
            <Activities><Activity>
            <PartnerKey xsi:nil=\"true\" />
            <PartnerProperties>
            <Name>PartnerApiObjectTypeId</Name><Value>42</Value>
            </PartnerProperties>
            <CreatedDate>2013-01-11T12:00:20.767</CreatedDate>
            <ObjectID>9e34164a-5089-4fe3-aee3-33f0a472de6f</ObjectID>
            <CustomerKey>ebf044ef-8266-433f-b424-cc0aeb3735bd</CustomerKey>
            <Name>test</Name>
            <Description/>
            <IsActive>true</IsActive></Activity></Activities>       
            </StepDefinition>
            </StepInstance>
            </StepInstances>
            <StartTime>2013-01-11T12:18:20.447</StartTime>
            <CompletedTime>2013-01-11T12:18:25.27</CompletedTime>
            </Results>
    </RetrieveResponseMsg>
</soap:Body>

それが MemoryStream に入った後、呼び出し元のクライアントに送り返されます。オブジェクトを見ると、StepInstances は null です。

また、投稿した WSDL は一部であり、主に問題のあるクラスであることに注意してください。返されたエンベロープは、これらのクラスを含むより大きなクラスであり、投稿するには多すぎました。

しかし、受信クライアントからステップインする最後のコードでは、メモリストリームが読み込まれます。次に f10 を押すと、呼び出し元のクライアントにオブジェクトが戻り、コレクションが null になります。

これが理にかなっており、誰かがそれに光を当てることができることを願っています. 必要なデータがあれば、投稿してみます。

また、アクセスできるのは .wsdl ファイルだけであり、実際の WCF プロジェクトやクラスではないことにも注意してください。

サービス参照を構成する場合: Collection Type には Generic.List を選択し、Dictionary Type には Generic.Dictionary を選択しました。

更新: wsdl 内の APIObject は次のようになります

    <complexType name="APIObject">
    <sequence>
      <element name="Client" type="tns:ClientID" minOccurs="0" maxOccurs="1"></element>
      <element name="PartnerKey" type="xsd:string" nillable="true" minOccurs="0" maxOccurs="1"></element>
      <element name="PartnerProperties" type="tns:APIProperty" minOccurs="0" maxOccurs="unbounded"></element>
      <element name="CreatedDate" type="xsd:dateTime" minOccurs="0" maxOccurs="1"></element>
      <element name="ModifiedDate" type="xsd:dateTime" minOccurs="0" maxOccurs="1" nillable="true"></element>
      <element name="ID" type="xsd:int" minOccurs="0" maxOccurs="1"></element>
      <element name="ObjectID" type="xsd:string" nillable="true" minOccurs="0" maxOccurs="1"></element>
      <element name="CustomerKey" type="xsd:string" minOccurs="0" maxOccurs="1"></element>
      <element name="Owner" type="tns:Owner" minOccurs="0" maxOccurs="1"></element>
      <element name="CorrelationID" minOccurs="0" type="xsd:string" />
      <element name="ObjectState" type="xsd:string" minOccurs="0" maxOccurs="1"></element>
      <element name="IsPlatformObject" minOccurs="0" maxOccurs="1" type="xsd:boolean" />
    </sequence>
  </complexType>

更新 #2: WCF であると誤解しています。.wsdl ファイルにしかアクセスできず、コンパイル後にサービス参照を .asmx ファイルにポイントします。

4

1 に答える 1

0

あなたが説明するようなさまざまなSOAPクライアントアプリケーションで、SOAP応答にシリアル化される元のクラスが直接オブジェクト参照であり、Getter/Setterプロパティを使用しない場合の問題が発生しました。したがって、次のようなことをしている場合:

[Serializable()]
public List<StepInstance> StepInstances = new List<StepInstance>;

...

[Serializable()]
public class StepInstance {
    public string PartnerKey = "";
    public string ObjectID = "";
}

...これは、一部のタイプのクライアントでは正しく機能しないように見える場合があります。代わりに、オブジェクトがパブリックゲッター/セッターメソッドを使用していることを確認してください。クライアントでオブジェクトを逆シリアル化する必要がある場合の問題は、発生しないように見える可能性があります。これがなぜであるかはわかりませんが、特定のタイプのSOAPクライアントに違いをもたらすようです。したがって、上記の例は次のようになります。

[Serializable()]
public List<StepInstance> StepInstances { get { return mStepInstances; } { set { mStepInstances = value; } }

private List<StepInstance> mStepInstances = new List<StepInstance>;

...

[Serializable()]
public class StepInstance {
    private string msPartnerKey = "";
    private string msObjectID = "";

    public string PartnerKey { get { return msPartnerKey; } set { msPartnerKey = value; } }
    public string ObjectID { get { return msObjectID; } set { msObjectID = value; } }
}
于 2013-01-17T17:54:34.397 に答える