2017-10-14 9 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; } 
} 

나는 다른 사람을 도움이되기를 바랍니다.