代码之家  ›  专栏  ›  技术社区  ›  Mike Chamberlain JaredPar

在WCF中序列化IDictionary<string,object>

  •  0
  • Mike Chamberlain JaredPar  · 技术社区  · 15 年前

    我们有一个现有的应用程序,其中一个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)网关 超时。

    尽管异常是立即抛出的(我实际上不必等一分钟就得到响应)。服务器上没有显示错误。

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

    所以我的问题是:

    1. 这是怎么回事?
    2. 如何解决此问题以便正确序列化对象?

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Eugene Osovetsky    15 年前

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

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

        2
  •  0
  •   Mike Chamberlain JaredPar    15 年前

    由于我自己或我的任何同事都无法想到一种直接使序列化工作的方法,因此我们最终解决了这个问题,将对象包装到一个自定义对象中,该对象转换为 Dictionary<string, object> 给一个 Dictionary<string, string> ,它具有为字符串数组定义的特殊序列化情况。然后我们更改了应用程序以了解这一点。不是特别优雅,但足够简单,而且似乎很管用。

    推荐文章