2011-01-06 119 views
0

我寫在.NET,在一個SOAP信封,將採取該消息,並響應與使用相同架構的SOAP消息接收XML對象的服務的具體架構。例如:獲取SOAP消息:在.NET

請求:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body xmlns="http://schemas.mystuff.org/myschema"> 
    <Message> 
     <Header>...</Header> 
     <MessageContent>...</MessageContent> 
    </Message> 
    </s:Body> 
</s:Envelope> 

響應:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body xmlns="http://schemas.mystuff.org/myschema"> 
    <Message> 
     <Header>...</Header> 
     <MessageContent>...</MessageContent> 
    </Message> 
    </s:Body> 
</s:Envelope> 

另外,我想最終沒有與對象的層次,但XML的只是字符串。

當我使用WCF ServiceContracts這樣做,則WCF定義包裝了一層額外爲其生成WSDL服務,例如:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
    <SendMessageResponse xmlns="http://tempuri.org/"> 
     <SendMessageResult xmlns:a="http://schemas.datacontract.org/2004/07/CxMessageReceiverRole" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <a:Message> 
      ... 
     </a:Message> 
     </SendMessageResult> 
    </SendMessageResponse> 
    </s:Body> 
</s:Envelope> 

什麼是對我來說,接收和發送SOAP消息的最佳方式在.NET中,我在控制消息的樣子而不是WCF?如果這不是最好的方式,它不一定是WCF。另外,我不想實現一個完整的類結構來表示我的XML模式,而只是將字符串接收到SOAP主體。

+0

爲什麼你需要控制的郵件是什麼樣子?誰會看他們? – 2011-01-06 21:48:38

回答

1

首先,你不能接收SOAP身體的字符串,如果你不發送字符串。你只能得到XML,但在這種情況下,你自動生成的WSDL將不包含你的身體格式的描述。它只會定義xsd:any這意味着任何格式良好的XML。

如果您不想包裝元素,則必須使用MessageContract而不是DataContract。 DataContracts總是使用基於操作名稱的默認包裝元素。 MessageContracts覆蓋此行爲並定義頂級元素。

我建議是這樣的:

[MessageContract] 
public class Message 
{ 
    [MessageBodyMember] 
    public XElement Header { get; set; } 
    [MessageBodyMember] 
    public XElement MessageContent { get; set; } 
} 

另一種方法是使用System.ServiceModel.Channels.Message類和手動讀取郵件內容。

+0

太棒了!這本書我讀學習WCF只是簡單地提到MessageContracts在引進,剛好夠長一提的是他們的東西,你不應該使用。當你不知道你要找的詞時,很難找到答案。非常感謝! – Mike 2011-01-07 13:42:49