2010-11-19 69 views
0

我们有一个现有的应用程序,其中一个DTO对象的属性类型为IDictionary<string, object>在WCF中序列化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", } } 
    }; 
} 

方法的Test1()正常工作,但是当我打电话的Test2(),我得到的客户端上的一个奇怪的运行时错误:

The request channel timed out while waiting for a reply after 00:01:00. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.

Inner exception: The remote server returned an error: (504) Gateway Timeout.

尽管异常是即时引发的,即。我实际上并不需要等一分钟才能做出回应。服务器上没有显示错误。

我怀疑这起源于串行器无法序列化对象[]的事实,但这不是错误所指示的。

所以我的问题是:

  1. 这到底是怎么回事?
  2. 我该如何解决这个问题,以便我可以正确地序列化我的对象?

谢谢。

+0

它必须是一个对象吗?如果它是一个字符串集合不能使用列表,数组等? – timothyclifford 2010-11-19 03:38:37

回答

0

由于无论是我自己还是我的任何同事都不能想出一种直接进行序列化的方法,我们最终通过将对象包装在一个自定义对象中来处理这个问题,该对象将Dictionary<string, object>转换为Dictionary<string, string>,该对象具有特殊的序列化案例为字符串数组定义。然后,我们更改了应用程序以了解这一点。不是特别优雅,但很简单,似乎工作。

0

我认为你需要使用KnownTypeAttribute将已知类型的对象[]添加到已知类型中,以使第二种情况起作用,因为这就是你放入字典中的内容。

在任何情况下,看到真正的错误在服务器上,你需要打开WCF跟踪(或其他运行在它停止上每个异常模式的调试程序,即使它抓住了)

+0

将object []添加到已知类型中并没有帮助(也没有添加对象,但我不认为它会)。 WCF实际上没有序列化对象[]的问题 - 在序列化之前将其转换为对象时会出现问题。这是当我们得到网关超时错误。 – 2010-11-22 02:06:17

相关问题