2012-06-28 3 views
4

고객이 제 3 자로부터 제공 한 XML 스키마 문서에서 생성 된 클래스 파일이 있습니다. 이 생성 된 클래스를 고객의 SOAP 웹 서비스에 사용할 수 있어야하지만 몇 가지 문제가 있습니다.WCF SOAP을 사용하여 XmlSerializer를 사용하여 루트 xmlns 추가

EPSStatus
[ServiceContract(Namespace = "http://theircompany.co.uk/theirapp/v1")] 
[XmlSerializerFormat] 
public interface IWebService 
{ 
    [OperationContract] 
    EPSStatus serviceNotifyDataEventSet(
     [XmlElement(Namespace = "http://www.thirdparty.org/thirdapp")] DataEventSet dataSet 
    ); 
} 

DataEventSet 내 생성 된 클래스 파일에 있습니다 : 나는 다음과 같은 웹 서비스에 연결하기 위해 WCF ChannelFactory을 사용할 수 있도록

나는 ServiceContract 인터페이스를 만들었습니다. DataEventSet의 중요한 비트 :

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.thirdparty.org/thirdapp")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.thirdparty.org/thirdapp", IsNullable=false)] 
public partial class DataEventSet { 
    //... 
} 

지금 나는 다음과 SOAP 본체 (WCF 추적 발견은 자신의 서버에서 사용)받을 IWebService.serviceNotifyDataEventSet를 호출하려고 :

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <serviceNotifyDataEventSet xmlns="http://theircompany.co.uk/theirapp/v1"> 
     <dataSet> 
      <dataEvents xsi:type="q1:DAInt" xmlns="" xmlns:q1="http://www.thirdparty.org/thirdapp"> 
       <id>47245361157</id> 
       <time> 
        <tick_time>141728877218</tick_time> 
        <time>2012-06-28T10:07:57.218+01:00</time> 
        <time_type>OSACBM_TIME_MIMOSA</time_type> 
       </time> 
       <value>42</value> 
      </dataEvents> 
      <id xmlns="">0</id> 
      <site xmlns=""> 
       <category>SITE_SPECIFIC</category> 
      </site> 
      <time xmlns=""> 
       <tick_time>141728877218</tick_time> 
       <time>2012-06-28T10:07:57.218+01:00</time> 
       <time_type>OSACBM_TIME_MIMOSA</time_type> 
      </time> 
     </dataSet> 
    </serviceNotifyDataEventSet> 
</s:Body> 

그래서, 내가 수 있어요 웹 서비스를 호출하고 내 데이터가 올바르게 직렬화되어있는 것처럼 보이지만 서버 쪽에서는 dataSet이 null이 될 것입니다. 나는 또한 다음과 같은 신체 작업 않는 클라이언트에서 추적을 가지고 :

<soap:Body> 
    <serviceNotifyDataEventSet xmlns="http://theircompany.co.uk/theirapp/v1"> 
     <dataSet xmlns="http://www.thirdparty.org/thirdapp"> 
      <dataEvents xmlns:q1="http://www.thirdparty.org/thirdapp" xsi:type="q1:DAReal" xmlns=""> 
       <id>47245361408</id> 
       <time> 
        <tick_time>141730618844</tick_time> 
        <time>2012-06-28T10:36:58.843+01:00</time> 
        <time_type>OSACBM_TIME_MIMOSA</time_type> 
       </time> 
       <value>12.34</value> 
      </dataEvents> 
      <id xmlns="">0</id> 
      <site xmlns=""> 
       <category>SITE_SPECIFIC</category> 
      </site> 
      <time xmlns=""> 
       <tick_time>141730618843</tick_time> 
       <time>2012-06-28T10:36:58.843+01:00</time> 
       <time_type>OSACBM_TIME_MIMOSA</time_type> 
      </time> 
     </dataSet> 
    </serviceNotifyDataEventSet> 
</soap:Body> 

내가 볼 수있는 유일한 차이점은 루트 네임 스페이스 작업 패킷에 dataSet에 설정되어 있습니다 : <dataSet xmlns="http://www.thirdparty.org/thirdapp">. 내 패킷에서 네임 스페이스가 전혀 지정되지 않았습니다.

제 질문은 제 분석이 합리적이라고 생각하니 그렇다면 루트 xmlns를 내 dataSet에 올바르게 출력 할 수있는 방법이 있습니까?

답변

1

이제는 비교적 간단하게 접근 할 수있게되었습니다. 다행히 XML 스키마에서 xsd으로 생성 된 코드는 모든 클래스를 생성자가없는 부분 클래스로 표시합니다. 다음과 같이 지금 serialises

public partial class DataEventSet 
{ 
    [XmlNamespaceDeclarations] 
    public XmlSerializerNamespaces _xmlns; 

    /// <summary> 
    /// Constructor for DataEventSet that sets up default namespaces 
    /// </summary> 
    public DataEventSet() 
    { 
     _xmlns = new XmlSerializerNamespaces(); 
     _xmlns.Add("", "http://www.thirdparty.org/thirdapp"); 
     _xmlns.Add("o", "http://www.thirdparty.org/thirdapp"); 
    } 
} 

: 다음과 같이 나는 네임 스페이스를 재정의하는 기본 생성자를 정의하는 내 자신의 부분 클래스를 추가 한

<?xml version="1.0" encoding="utf-8"?> 
<s:Body xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <serviceNotifyDataEventSet xmlns="http://theircompany.co.uk/theirapp/v1"> 
    <dataSet xmlns="http://www.thirdparty.org/thirdapp" xmlns:o="http://www.thirdparty.org/thirdapp"> 
     <dataEvents xsi:type="o:DABool" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <id>47245361157</id> 
     <value>true</value> 
     </dataEvents> 
     <id xmlns="">0</id> 
     <site xmlns=""> 
     <category>SITE_SPECIFIC</category> 
     </site> 
     <time xmlns=""> 
     <tick_time>396106152171</tick_time> 
     <time>2012-07-20T13:29:12.171Z</time> 
     <time_type>OSACBM_TIME_MIMOSA</time_type> 
     </time> 
    </dataSet> 
    </serviceNotifyDataEventSet> 
</s:Body> 
0

귀하의 anaylsis 합리적인 소리. 귀하가 게시 한 코드를 살펴보면 DataEventSet 클래스가 <dataSet> 요소와 관련하여 살펴 봐야하는 클래스인지 여부를 질문합니다. System.Xml.Serialization.XmlRootAttribute을 사용하면 요소에 대해 올바른 네임 스페이스를 정의/적용 할 수 있습니다. 제 생각 엔 <dataSet> 요소를 올바르게 출력하려면이 속성이 다른 클래스에 필요합니다.

관련 문제