2017-10-14 89 views
2

我要實現一個給定的客戶端WCF服務,所以命名空間和合同不是由我定義。問題是,當我使用複雜類型作爲MessageBodyMember時,在服務器端,給定成員在我的服務器端設置爲null。WCF MessageBodyMember複雜型和命名空間

下面是示例請求:

<?xml version="1.0" encoding="utf-8" ?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Header> 
     <ns1:CustomeHeader xmlns:ns1="HEADER_NAMESPACE"> 
      <version>1.0</version> 
     </ns1:CustomeHeader> 
    </soapenv:Header> 
    <soapenv:Body> 
     <ns2:in4 xmlns:ns2="NAMESPACE_1"> 
      <ns39:userID xmlns:ns39="NAMESPACE_2"> 
       <ns40:ID xmlns:ns40="NAMESPACE_3">someFakeID_123</ns40:ID> 
       <ns41:type xmlns:ns41="NAMESPACE_3">0</ns41:type> 
      </ns39:userID> 
     </ns2:in4> 
    </soapenv:Body> 
</soapenv:Envelope> 

正如你所看到的,userID是,其成員已經定義的命名空間的複雜類型。這是我正在談論的MessageBodyMember。

這裏是我們的服務我的接口定義和實現:

[XmlSerializerFormat] 
public interface IIntegrationService 
{ 
    [OperationContract] 
    [XmlSerializerFormat] 
    SyncOrderRelationshipRsp syncOrderRelationship(SyncOrderRelationshipReq syncOrderRelationshipReq); 
} 

[ServiceContract] 
public class IntegrationService : IIntegrationService 
{ 
    public SyncOrderRelationshipRsp syncOrderRelationship(SyncOrderRelationshipReq syncOrderRelationshipReq) 
    { 
     //some code here ... 
    } 
} 

這裏是SyncOrderRelationshipReq的定義和UserID

[MessageContract(IsWrapped = true, WrapperName = "in4", WrapperNamespace = "HEADER_NAMESPACE")] 
public class SyncOrderRelationshipReq 
{ 
    [MessageHeader(Namespace = "HEADER_NAMESPACE")] 
    public IBSoapHeader IBSoapHeader { get; set; } 

    [MessageBodyMember(Namespace = "NAMESPACE_2")] 
    public UserID userID { get; set; } 
} 

[MessageContract(WrapperNamespace = "NAMESPACE_2", IsWrapped = true)] 
public class UserID 
{ 
    [MessageBodyMember(Namespace = "NAMESPACE_3")] 
    public string ID { get; set; } 

    [MessageBodyMember(Namespace = "NAMESPACE_3", Name = "type")] 
    public int Type { get; set; } 
} 

爲了使長話短說,我需要的內MessageBodyMember的成員有自己的命名空間,以便我可以閱讀這些成員。

回答

1

我終於找到了答案。對於來這裏找到答案的人來說,這就是答案。 首先,你應該添加XmlSerializerFormat屬性到你的服務接口(我已經這樣做了)。

其次,你應該使用XmlType屬性的複雜類型的類。

三,用途XmlElement屬性的複雜類型的屬性。

因此,UserId類應該是這樣的:

[XmlType] 
public class UserID 
{ 
    [XmlElement(Namespace = "NAMESPACE_3")] 
    public string ID { get; set; } 

    [XmlElement(Namespace = "NAMESPACE_3", Name = "type")] 
    public int Type { get; set; } 
} 

我希望它可以幫助別人。