在WCF中序列化IDictionary <string,object>
我们有一个现有的应用程序,其中一个DTO对象具有类型为IDictionary<string, object>
的属性。
我现在试图通过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", } }
};
}
方法Test1()按预期工作,但是当我调用Test2()时,客户端上出现奇怪的运行时错误:
请求通道在00:01:00之后等待回复时超时。 增加传递给请求调用的超时值或增加绑定上的SendTimeout值。 分配给此操作的时间可能是超时时间的一部分。
内部异常:远程服务器返回错误:(504)网关超时。
尽管事实上即时抛出异常,即。 我实际上并不需要等一分钟才能做出回应。 服务器上没有显示错误。
我怀疑这是源于串行器无法序列化对象[]的事实,但这不是错误所指示的。
所以我的问题是:
谢谢。
我认为您需要使用KnownTypeAttribute将已知类型的对象[]添加到第二种情况,因为这就是您要放入字典的内容。
在任何情况下,要查看服务器上的真实错误,您需要打开WCF跟踪(或者以停止所有异常的模式运行调试器,即使它被捕获)
由于我或我的任何同事都不能想出一种方法来直接进行序列化,所以我们最终通过将对象包装在自定义对象中来处理问题,该自定义对象将Dictionary<string, object>
转换为Dictionary<string, string>
,它为字符串数组定义了一个特殊的序列化大小写。 然后,我们更改了应用程序以了解这一点。 不是特别优雅,但很简单,似乎工作。