型の配列を宣言する WSDL を使用しようとすると、.NET は応答メッセージを逆シリアル化できません。
WSDL
https://docs.google.com/open?id=0B5Se_xHASR2LS0EtdmxfNGZWMTg
自動生成されたクライアント プロキシ コード
Visual Studio は、このサービス操作の応答メッセージに対して次の定義を作成します。
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="GetServiceRequestSummariesMatchingProfileResponse", WrapperNamespace="http://www.acme.com/webservices/connectors/731/servicerequest/message" +
"types", IsWrapped=true)]
public partial class GetServiceRequestSummariesMatchingProfileResponse {
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.acme.com/schema/uniform/731/servicerequest/sr/srtypes", Order=0)]
[System.Xml.Serialization.XmlElementAttribute("ServiceRequestSummary")]
public ServiceRequestSummaryType[] ServiceRequestSummary;
public GetServiceRequestSummariesMatchingProfileResponse() {
}
public GetServiceRequestSummariesMatchingProfileResponse(ServiceRequestSummaryType[] ServiceRequestSummary) {
this.ServiceRequestSummary = ServiceRequestSummary;
}
}
これは機能せず、シリアライザーは ServiceRequestSummaryType[] 内の ServiceRequestSummaryType オブジェクトを逆シリアル化できないため、応答が含まれているかどうかに関係なく、常に空になります。
応答 SOAP メッセージ
<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">
<s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"></s:Header>
<soap:Body>
<GetServiceRequestSummariesMatchingProfileResponse xmlns="http://www.acme.com/webservices/connectors/731/servicerequest/messagetypes">
<ServiceRequestSummary xmlns="http://www.acme.com/schema/uniform/731/servicerequest/sr/srtypes">
<ServiceRequestIdentification>
<ServiceRequestTechnicalKey>MD2P24BENM001</ServiceRequestTechnicalKey>
<ReferenceValue>12/00056/SR</ReferenceValue>
<AlternativeReferences>
<AlternativeReference xmlns="http://www.acme.com/schema/uniform/72b/common/uniformtypes">
<ReferenceValue>ssa</ReferenceValue>
<ReferenceType>FIRM</ReferenceType>
</AlternativeReference>
</AlternativeReferences>
</ServiceRequestIdentification>
<SiteLocation>
<Address> </Address>
<UPRN></UPRN>
</SiteLocation>
<NatureOfComplaint>Test</NatureOfComplaint>
<AdministrationDetails>
<RequestTypeCode>DFOUL</RequestTypeCode>
<RequestTypeText>Dog fouling</RequestTypeText>
<RequestKindCode>D</RequestKindCode>
<RequestKindText>Dog Request</RequestKindText>
<AllocatedToCode>EHCALL</AllocatedToCode>
<AllocatedToText></AllocatedToText>
<TimeAllocated></TimeAllocated>
<AllocationHistory>
<AllocationHistoryDetail>
<OfficerCode>EHCALL</OfficerCode>
<OfficerName>EH Call Centre</OfficerName>
<AllocationDateTime>2012</AllocationDateTime>
</AllocationHistoryDetail>
</AllocationHistory>
<HowReceivedCode>TELE</HowReceivedCode>
<HowReceivedText>telephone</HowReceivedText>
<TimeReceived>2012-11-02T13:40:00</TimeReceived>
<StatusCode>1_NEW</StatusCode>
<StatusText>1_NEW - New Request</StatusText>
</AdministrationDetails>
<SubjectDetails>
<SubjectContactDetails></SubjectContactDetails>
</SubjectDetails>
<RequestType>DOG</RequestType>
<RequestKindCode>D</RequestKindCode>
<RequestKindText>Dog Request</RequestKindText>
</ServiceRequestSummary>
</GetServiceRequestSummariesMatchingProfileResponse>
<TransactionReport xmlns="">
<TransactionComplete>True</TransactionComplete>
<TransactionSuccess>True</TransactionSuccess>
<TransactionMessages></TransactionMessages>
</TransactionReport>
</soap:Body>
</soap:Envelope>
しかし、ネットを探し回った後、説明のない似たようなものに気付きました。名前空間を含めるように自動生成されたコードを変更した場合;
とても気になった
[System.Xml.Serialization.XmlElementAttribute("ServiceRequestSummary")]
我々は持っています
[System.Xml.Serialization.XmlElementAttribute("ServiceRequestSummary", Namespace = "http://www.acme.com/schema/uniform/731/servicerequest/sr/srtypes")]
その後、動作します。すべてのVSがエラーなしでWSDLからクライアントプロキシコードを自動生成した後、逆シリアル化を失敗させているWSDLまたは応答メッセージの何が問題なのかわかりません。
自動生成コードを変更することは、これを引き起こしている可能性のあるものを葉巻で見つけることができる場合、実行可能な解決策ではありません.