序列化IDictionary<;字符串,对象>;在WCF中

序列化IDictionary<;字符串,对象>;在WCF中,wcf,serialization,Wcf,Serialization,我们有一个现有的应用程序,其中一个DTO对象的属性类型为IDictionary 我现在正试图通过WCF服务公开这个对象。这在某些情况下有效,但在一般情况下无效。为了演示这个问题,请考虑以下两种方法: [OperationContract] public IDictionary<string, object> Test1() { return new Dictionary<string, object> { { "testkey1", "ne

我们有一个现有的应用程序,其中一个DTO对象的属性类型为
IDictionary

我现在正试图通过WCF服务公开这个对象。这在某些情况下有效,但在一般情况下无效。为了演示这个问题,请考虑以下两种方法:

[OperationContract]
public IDictionary<string, object> Test1()
{
    return new Dictionary<string, object>
    {
        { "testkey1", "newstringvalue"},
    };
}

[OperationContract]
public IDictionary<string, object> Test2()
{
    return new Dictionary<string, object>
    {
        { "testkey1", "newstringvalue"},
        { "testkey2", new object [] { "one" , "two", "three", } }
    };
}
[运营合同]
公共IDictionary Test1()
{
返回新词典
{
{“testkey1”,“newstringvalue”},
};
}
[经营合同]
公共IDictionary Test2()
{
返回新词典
{
{“testkey1”,“newstringvalue”},
{“testkey2”,新对象[]{“一”、“二”、“三”,}
};
}
方法Test1()按预期工作,但当我调用Test2()时,客户端上出现了一个奇怪的运行时错误:

请求通道在运行时超时 正在等待00:01:00后的答复。 增加传递给的超时值 请求或增加 绑定上的SendTimeout值。这个 分配给此操作的时间可能会缩短 已经是一段较长的历史的一部分 超时

内部异常:远程服务器 返回错误:(504)网关 超时

尽管异常是立即抛出的,也就是说,我实际上不需要等待一分钟就可以得到这个响应。服务器上未显示任何错误

我怀疑这是因为序列化程序无法序列化对象[],但这不是错误所指示的

因此,我的问题是:

  • 这是怎么回事
  • 如何解决这个问题,以便正确序列化对象

  • 谢谢。

    我认为您需要使用KnownTypeAttribute将object[]添加到已知类型中,以使第二个案例生效,因为这是您要放入词典的内容


    在任何情况下,要查看服务器上的真正错误,您需要打开WCF跟踪(或者在每次异常时停止调试器的模式下运行调试器,即使它被捕获)

    ,因为我和我的任何同事都想不到一种方法来直接使此序列化工作,我们最终解决了这个问题,将对象包装在一个自定义对象中,该对象将
    字典
    转换为
    字典
    ,该字典为字符串数组定义了一个特殊的序列化案例。然后我们更改了应用程序以了解这一点。不是特别优雅,但足够简单,而且似乎有效。

    它必须是对象吗?如果它是字符串的集合,您不能使用列表、数组等吗?将object[]添加到已知类型没有帮助(添加object也没有帮助,尽管我认为不会)。WCF序列化对象[]实际上没有问题-在序列化之前将其强制转换为对象时会出现问题。这是当我们得到网关超时错误。