我試圖使用WCF客戶端提供AXIS Web服務的供應商。該服務期望將請求/響應元素<TXLife>
作爲SOAP主體的根元素(不包括它的操作元素)。我正在使用XmlSerializer,因爲我的數據契約有一些自定義的ACORD架構特性。例如,服務器想看到下面的(...是的,「服務」是操作的名字......):WCF - 自定義的客戶端請求/響應XML
...<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><TXLife><TXLifeRequest xmlns="">...
我的客戶端生成與操作XML序列化的像這樣的包裝元素:
...<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><service xmlns="urn:example.servicecontract"><TXLife><TXLifeRequest xmlns="">...
隨着「額外」的標籤表明在請求服務的操作無法處理請求和錯誤的。如果我刪除<service>
標記,Web服務將愉快地處理請求。
不幸的是,該服務也將響應打倒展開<TXLife>
標籤作爲根元素:
...<soapenv:Body><TXLife xmlns=""><TXLifeResponse>...
我解串器沒有正確處理響應,我得到一個null
對象返回。我假設,因爲我的客戶期望服務操作響應包裝標籤,而不是得到一個。在反序列化級別,我沒有從調試器那裏得到很多幫助。
我正在考慮實現IClientMessageFormatter甚至IClientMessageInspector來修改請求/響應(例如,從請求消息中刪除操作標記並向響應消息添加響應標記)。我知道格式化程序是作爲OperationalBehavior注入的,但我不確定MessageInspector放入堆棧的位置。也許我會以錯誤的方式去做這件事...... 任何有識之士或建議,將不勝感激。原諒我,這是我第一次嘗試WCF服務,我正在慢慢感受我的方式。不幸的是,這項服務的一切似乎都是「自定義」的。
我的服務合同:
[XmlSerializerFormat]
[ServiceContract(Namespace="urn:example.servicecontract")]
public interface IPayoutServiceContract
{
[OperationContract]
TXLife service([MessageParameter(Name = "TXLife")]TXLife request);
}
服務的WSDL的一部分:
<wsdl:types><schema targetNamespace="urn:Tx103Service" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><import id="tx" namespace="http://ACORD.org/Standards/Life/2" schemaLocation="../acord/TXLife2.8.92.xsd" /></schema></wsdl:types><wsdl:message name="serviceRequest"><wsdl:part element="tx:TXLife" name="acordRequest" /></wsdl:message><wsdl:message name="serviceResponse"><wsdl:part element="tx:TXLife" name="acordResponse" /></wsdl:message><wsdl:portType name="LifeWebService"><wsdl:operation name="service"><wsdl:input message="impl:serviceRequest" name="serviceRequest" /><wsdl:output message="impl:serviceResponse" name="serviceResponse" /></wsdl:operation></wsdl:portType>
更新:
我第一次使用的代理類MessageContract(isWrapped=false)
裝飾試過(界面不允許它)。那什麼都沒做。我也嘗試BodyStyle = WebMessageBodyStyle.Bare
的口味,也沒有。我認爲這是由於我使用的XMLSerializer。在我看來,沒有簡單的方法來「圍繞」解決這個問題。
BTW:我的服務合同,數據合同,並代理客戶都在按照此建議聽起來固體給我單獨的項目: blog post by Miguel Castro
UPDATE2:
我創建裝飾請求/響應的包裝類帶有MessageContract/MessageBodyMember標籤。現在XML按預期生成。仍然收到響應中的空對象...
UPDATE3:
「空」在我的反應對象是實際存在於XML響應,但沒有被反序列化,因爲串行一直在尋找他們的合格對象。我把它們改成了非合格的,然後我的物品顯得很好。
查看原始問題的更新。謝謝! :) – 2011-02-25 19:43:55
我很困惑......你嘗試在界面上的MessageContract?這不是如何使用......你的方式是通過創建一個類來表示消息,將其標記爲[MessageContract],然後將一個TXLife類型的屬性標記爲[MessageBodyMember]。然後你會使用這個新的類作爲操作參數(沒有[MessageParameter]) – tomasr 2011-02-25 20:28:06
我沒有正確實現MessageContracts。我相信我已經過了坎坷,但我的服務現在已經停止了,而且更多的測試將不得不等待。更多來...;) – 2011-02-25 22:21:24