2014-01-10 90 views
1

我們正在嘗試開發一種Web服務,它將取代我們的客戶端所使用的現有Web服務。這意味着來自WCF中新Web服務的SOAP響應必須與來自當前Web服務(這是使用Java編寫的傳統服務)的SOAP響應完全匹配。我們在使新服務返回與舊服務相同的SOAP響應方面遇到了麻煩。WCF服務的SOAP格式化

最初,我們開始使用DataContract作爲響應的結構,但是由於它產生了一些額外的標籤,我們切換到MessageContract。

以下是DataContAract作爲請求和響應屬性的示例請求和響應。我們面臨兩個問題與使用DataContract -

  1. 的響應,有兩個額外的標記GetDataUsingDataContractReponseGetDataUsingDataContractResult我們不能以編程方式刪除。

  2. 我們無法獲得BoolValue屬性作爲XML屬性,而是顯示爲XML元素。

如果你能分享任何想法,你必須解決這兩個問題,我們將不勝感激。以下是使用DataContract的示例請求和響應。

請求與DataContract DataContract-

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:mem="http://schemas.datacontract.org/2004/07/MemoPayment"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:GetDataUsingDataContract> 
     <!--Optional:--> 
     <tem:composite> 
      <mem:BoolValue>true</mem:BoolValue> <!--Not able to make this value as XML Attribute. Instead, always shows up as XML Element -->  
      <mem:StringValue>Sam</mem:StringValue> 
     </tem:composite> 
     </tem:GetDataUsingDataContract> 
    </soapenv:Body> 
</soapenv:Envelope> 

響應:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <GetDataUsingDataContractResponse xmlns="http://tempuri.org/"> 
     <GetDataUsingDataContractResult xmlns:a="http://schemas.datacontract.org/2004/07/MemoPayment" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">          à Extra tags showing up. Any way to remove them? 
      <a:BoolValue>true</a:BoolValue> 
      <a:StringValue>SamSuffix</a:StringValue> 
     </GetDataUsingDataContractResult> 
     </GetDataUsingDataContractResponse> 
    </s:Body> 
</s:Envelope> 

要對SOAP消息的更多控制,我們已經從DataContract切換到MessageContract現在響應正被呈現爲預期使用XML屬性和XML元素。

但是,使用MessageContract的問題是所有XML元素都顯示爲可選。示例 - StringValue在下面的請求中。再次,如果您能根據您的經驗提出任何解決方法,我們將不勝感激。

請求與MessageContract:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:MsgRequest boolVal="true"> 
     <!--Optional:--> 
     <tem:StringValue>Sam</tem:StringValue>        à Always showing up as Optional. Not able to control from the code. Any way to remove the Optional attribute? 
     </tem:MsgRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

與MessageContract響應:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <MsgResponse boolVal="true" xmlns="http://tempuri.org/"> 
     <StringValue>SamSuffix</StringValue> 
     </MsgResponse> 
    </s:Body> 
</s:Envelope> 

回答

1

在過去,當我們的球隊需要完全控制WCF服務的輸出,我們使用XmlSerializer的,而不是數據和/或消息合同。

WCF支持XmlSerializer類,它不是WCF唯一的。 XmlSerializer類支持比DataContractSerializer類更窄的一組類型,但允許對生成的XML進行更多的控制,並支持更多的XML模式定義語言(XSD)標準。它也不需要可序列化類型的任何聲明性屬性。有關更多信息,請參閱.NET Framework文檔中的XML序列化主題。

參考:
http://msdn.microsoft.com/en-us/library/ms733901(v=vs.110).aspx