序列化IDictionary<;字符串,对象>;在WCF中
我们有一个现有的应用程序,其中一个DTO对象的属性类型为序列化IDictionary<;字符串,对象>;在WCF中,wcf,serialization,Wcf,Serialization,我们有一个现有的应用程序,其中一个DTO对象的属性类型为IDictionary 我现在正试图通过WCF服务公开这个对象。这在某些情况下有效,但在一般情况下无效。为了演示这个问题,请考虑以下两种方法: [OperationContract] public IDictionary<string, object> Test1() { return new Dictionary<string, object> { { "testkey1", "ne
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序列化对象[]实际上没有问题-在序列化之前将其强制转换为对象时会出现问题。这是当我们得到网关超时错误。