将列表类型作为对象返回时发生C#WCF异常

时间:2017-04-10 05:55:00

标签: c# wcf

--- 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之类的变量不是问题。

返回列表类型会抛出异常。

发生异常:服务器未提供有意义的回复;这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的。

有解决方案吗?

4 个答案:

答案 0 :(得分:1)

您的方法测试应该返回List的类型而不是object,

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

答案 1 :(得分:1)

问题是服务器不知道如何序列化object - 它可能完全是任何东西。

正如其他答案所说,您需要将其作为List<bool>返回,以便可以将其序列化(转换为json / xml)并发送给客户端

答案 2 :(得分:1)

  

WCF需要知道您传递的是哪种类型,以便它可以反序列化该对象,换言之, WCF是强类型框架。

C# WCF Passing Dictionary<string, object> parameter

答案 3 :(得分: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>