2011-06-28 55 views
4

我想知道是否有更改WCF SOAP請求的名稱空間前綴?更改名稱空間前綴WCF信封

正如您在下面的示例中看到的,The Envelope具有名稱空間「http://www.w3.org/2005/08/addressing」,前綴爲「a」。我想把它改成'foo'。我怎樣才能做到這一點。 注意我沒有控制服務代碼,我只能從WSDL創建代理類。

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Header> 
<a:Action s:mustUnderstand="1">http://www.starstandards.org/webservices/2005/10/transport/operations/MyAction</a:Action> 
<h:payloadManifest xmlns="http://www.starstandards.org/webservices/2005/10/transport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:h="http://www.starstandards.org/webservices/2005/10/transport"> 
<manifest contentID="Content0" namespaceURI="http://www.starstandard.org/STAR/5" element="TESTMETHOD" version="5.2.4"></manifest> 
</h:payloadManifest> 
<h:Identity xmlns="urn:xxx/xxx/" xmlns:h="urn:xxx/xxx"> 
<SiteCode>XXXXXX</SiteCode> 
</h:Identity> 
<a:To>urn:xxx/xxx/Method1</a:To> 
<MessageID xmlns="http://www.w3.org/2005/08/addressing">XXXXX</MessageID> 
<a:ReplyTo> 
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
</a:ReplyTo> 
</s:Header> 
+0

你爲什麼想改變前綴?對於正確理解XML的任何東西都不應有任何區別。 –

+0

我知道只是改變前綴應該沒有什麼區別,但是我將要使用的服務,我無法控制它並且不知道它如何處理SOAP請求。目前我正在收到服務器錯誤消息與一個很好的期望前綴的元素有關。它的消除過程。 thx – daehaai

+0

感謝所有的答覆。我認爲這可以實現的一種方式是使用IClientMessageInspector,IEndpointBehavior,如圖所示http://social.technet.microsoft.com/wiki/contents/articles/how-to-inspect-wcf-message-headers-using-iclientmessageinspector的.aspx。在請求發送之前,其中一個事件被觸發。此時,您可以獲得行SOAP消息並進行操作(概率不可取)。希望這有助於其他人。 – daehaai

回答

0

WCF提供使用消息協定來控制大部分SOAP信封細節的能力。 但是我懷疑你是否可以用命名空間前綴做一些事情。但是,您可以控制名稱空間。

請參考Using Message Contracts

+0

感謝但使用消息合約意味着有控制權的服務器端代碼。我沒有。 – daehaai

+1

不需要。總體而言,WCF不是編寫服務的技術。它的溝通。你甚至可以爲WCF客戶端編寫非WCF服務。在你的情況下,你可以使用WCF創建客戶端,你也可以爲你的客戶端代碼創建消息合約。如果您使用的是Visual Studio,則服務引用對話框將爲您提供在「高級」選項下創建消息合同的選項。如果使用svcutil.exe創建客戶端,則可以使用/ mc開關創建消息協定。 – SaravananArumugam

0

我不知道有什麼方法可以控制WCF使用其標準的消息編碼器的前綴。

我想你會寫一個自定義消息編碼器,如果你想在電線上的消息使用不同的前綴。

2

這可以通過使用MessageFormatter在客戶端或服務器端完成。你也可以用MessageEncoder來改變它,但是這有很多問題。

本文介紹如何使用MessageFormatter,也是一個MessageEncoder,具體的缺點做這在服務器端:

http://vanacosmin.ro/Articles/Read/WCFEnvelopeNamespacePrefix

你需要做的是應用MessageFormatter客戶端(也許使用ApplyClientBehavior而不是ApplyDispatchBehavior)。另外,在自定義消息類中,您需要將名稱空間添加爲屬性,並使用「foo」前綴(在OnWriteStartEnvelope方法中)。

不幸的是,有沒有簡單的方法(如應用一些屬性),將做出您需要的更改。