2017-04-10 29 views
2
--- SERVER 
[ServiceContract(Namespace = "TEST")] 
public interface IServer 
{ 
    [OperationContract]   
    object test(); 
} 


[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.PerSession)] 
class ServerWCallbackImpl : IServer 
{ 
    public object test() 
    { 
     List<bool> data = new List<bool>(); 
     data.Add(false); 
     data.Add(true); 
     data.Add(false); 
     return data; 
    } 
} 

---- CLIENT 
DuplexChannelFactory<IServer> cf = 
      new DuplexChannelFactory<IServer>( new CallbackImpl(), new NetTcpBinding(SecurityMode.None), new EndpointAddress("net.tcp://localhost:8080/TEST")); 
     IContractServerAgent srv = cf.CreateChannel(); 
     List<bool> data = srv.test() as List<bool>; 


----------------------- 

返回變量(如int或bool)不是問題。C#WCF返回列表類型作爲對象時發生異常

返回列表類型拋出異常。

發生異常:服務器沒有提供有意義的回覆;這可能是由於合同不匹配,會話過早關閉或內部服務器錯誤造成的。

有沒有解決方案?

回答

1

你的方法測試應該返回列表的類型,而不是對象,

public List<bool> test() 
    { 
     List<bool> data = new List<bool>(); 
     data.Add(false); 
     data.Add(true); 
     data.Add(false); 
     return data; 
    } 
+0

我可以返回列表,對象類型? – Hoony

+0

否,因爲您正在添加到列表 – Sajeetharan

1

的問題是,服務器不知道如何序列化object - 它可以毫不誇張地說是任何東西。

至於其他的答案說,你需要的,如果你想返回一個對象,然後考慮使用,使其恢復爲List<bool>,以便它可以被序列化(變成JSON/XML)和發送到客戶端

0

Stream這樣的:

public Stream test() 
{ 
    List<bool> data = new List<bool>(); 
    data.Add(false); 
    data.Add(true); 
    data.Add(false); 
    return MemoryStream(Encoding.UTF8.GetBytes(data)); 
} 

或簡單地返回List<bool>