2013-01-16 43 views
1

我是WCF和Stackoverflow的新手。我正在嘗試處理來自現有客戶端的SOAP(1.2)請求。將 的消息,如: WCF:如何使用不同名稱空間反序列化SOAP消息的參數?

<s:Body> 
    <ns1:MyMethod> 
    <ns1:Parameter1> A string value </ns1:Parameter1> 
    <ns2:Parameter2> Another string value </ns2:Parameter2> 
    </ns1:MyMethod> 
</s:Body> 

這裏是我的服務器端代碼:

[SerivceContract(Namespace = "ns1...")] 
public class IMyService 
{ 
    [OperationContract(Action="http://the action url")] 
    void MyMethod(string Parameter1, string Parameter2); 
} 

我可以得到 「參數1」 正確的反序列化,但 「參數2」始終爲空。我想這是因爲不同的命名空間(ns1 vs ns2)。 有幫助嗎?

+0

難道你使用「添加服務參考」? –

+0

感謝您的回覆。我的問題是在服務器端。 –

+0

ns1和ns2的定義是什麼? –

回答

0

必須創建服務以適應客戶端已經發送的請求是非常不尋常的。

這就像試圖購買支持15年前的打印機驅動程序的新電腦。

解決方案:只需購買一臺新打印機。

客戶端應該消耗服務,而不是其他方式。

欣賞這並不直接回答你的問題,可能超出瞭解決方案的範圍。

0

這是一個古老的問題,但我試圖找到類似問題的答案時偶然發現了它。 參數1被反序列化的原因而不是參數2可能是因爲兩個字段都沒有名稱空間定義,所以它們從它們的父級(MyMethod)繼承了名稱空間。這也在this線程中解釋過。 對於目前的情況下,你需要使用自定義XmlSerializerFormat和NS2命名空間添加到參數2:

[ServiceContract(Namespace = "http://ns1.com")] 
[XmlSerializerFormat] 
public interface IOpenInvoiceInterface 
{ 
    [OperationContract] 
    MyMethod Test(MyMethod req); 
} 

public class MyMethod 
{ 
    [MessageBodyMember] 
    public string Param1 { get; set; } 

    [MessageBodyMember(Namespace = "http://ns2.com")] 
    public string Param2 { get; set; } 
} 

在此設置下,預期以下的通話將被反序列化:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ns1.com" xmlns:ns2="http://ns2.com"> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ns1:MyMethod > 
     <ns1:Param1>abc</ns1:Param1> 
     <ns2:Param2>cde</ns2:Param2> 
    </ns1:MyMethod> 
    </s:Body> 
</s:Envelope> 
相關問題