2012-11-01 76 views
4

我有一個WCF服務類似以下內容:發送複雜類型在SOAP消息中的參數

public class Service1 : IService1 
{ 
    public string GetData(Person person) 
    { 
     if (person != null) 
     { 
      return "OK"; 
     } 
     return "Not OK!"; 
    } 

這裏是我的Person類:

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public int Age { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

而且我這樣的呼叫服務:

BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None); 
     IChannelFactory<IRequestChannel> factory = binding.BuildChannelFactory<IRequestChannel>(new BindingParameterCollection()); 
     factory.Open(); 

     EndpointAddress address = new EndpointAddress(url); 
     IRequestChannel irc = factory.CreateChannel(address); 
     using (irc as IDisposable) 
     { 
      irc.Open(); 
      string soapMessage = "<GetData><person><Age>24</Age><Name>John</Name></person></GetData>"; 

      XmlReader reader = XmlReader.Create(new StringReader(soapMessage)); 
      Message m = Message.CreateMessage(MessageVersion.Soap11,"http://tempuri.org/IService1/GetData", reader); 

      Message ret = irc.Request(m); 
      reader.Close(); 
      return ret.ToString(); 
     } 

當我嘗試發送像Person這樣的複雜類型作爲GetData方法的參數時,person對象將變爲null。但是當我發送像integer,string等已知類型作爲參數時,我沒有問題。

如何管理將複雜類型作爲參數發送到服務方法?

+0

Person的代碼是什麼?它是否標有[DataContact]? http://msdn.microsoft.com/en-us/library/ms733127.aspx – ErnieL

+0

是的,也用Person類更新了我的問題。 –

+0

爲什麼不只是使用服務參考? –

回答

1

我遇到了類似的情況,我們最終改變服務的接口是等價的:

public string GetData(string person) 

我們調用Web服務之前做了我們自己的對象序列化。立即在Web服務方法中,我們將反序列化它,並正常進行。

+0

嗨安德魯,這是一個很好的解決方案,但它不適合我們的場景。 Web服務由另一家公司提供,我們將不會有任何反序列化參數的機會。 –

相關問題