【问题标题】:Passing IDictionary object to Web service将 IDictionary 对象传递给 Web 服务
【发布时间】:2011-02-08 23:45:07
【问题描述】:

在我的 asmx 文件中,我有

        [WebMethod]
        [ScriptMethod]
        public void Method(IDictionary<string, CustomClass> objectOfCustomClass)
        {
           //do stuff
        }

自定义类定义为:

public class CustomClass
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }       
    }

一切顺利,已从 Jquery ajax 方法成功使用 Web 服务。最近我决定测试并尝试从http://localhost/Services.asmx/Method等直接URL访问它

我收到了这条消息

“无法序列化接口 System.Collections.Generic.IDictionary”

这似乎不对。是什么原因造成的,是否正常?我很困惑——这似乎是一种干净的做事方式,但根据微软的说法,不应该这样做,但它可以工作,只是在直接访问 Web 服务时不行。是什么赋予了?我还在一些 MS 网站上读到,您无法将 IDictionary 作为参数传递给 Web 服务,但它工作正常......所以它可以完成吗?有人可以一劳永逸地澄清这一点吗?

【问题讨论】:

    标签: web-services idictionary


    【解决方案1】:

    很遗憾,是的,这很正常。您看到的是经典 ASP.NET Web 服务堆栈中 XML 序列化(XmlSerializer)的限制 - 它拒绝与任何实现 IDictionary 的东西一起工作。

    通过 [ScriptMethod] 暴露给 JavaScript 的服务使用了不同的序列化器(JavaScriptSerializer),它没有这个限制。

    当您从 JavaScript 调用服务时,您调用 JSON 端点(使用 [ScriptMethod] 声明)。但是,当您从浏览器进行测试时,您会到达传统的 XML 端点(使用 [WebMethod] 声明)。

    有一些解决方法,请参阅例如this question。但是,如果您只需要支持 AJAX 客户端,您可以简单地删除 XML 端点([WebMethod] 属性)并避免此问题。

    附带说明,WCF 中改进的序列化程序支持字典的序列化。

    【讨论】:

    • 知道了。我实际上不需要通过浏览器访问 Web 服务——我只在我的 Jquery 中使用 ajax 方法(JSON 格式)调用它,所以也许我会保持原样。我只是想找出问题所在。
    【解决方案2】:

    ASMX Web 服务使用 XmlSerializer 序列化和反序列化对象,并且没有一种好的方法可以在适当的 XML 架构中表示字典。不幸的是,除了将您的 IDictionary 转换为可以由 XmlSerializer 序列化的另一种类型的对象之外,我认为没有其他好的方法。

    摘自这篇文章“.NET Framework 中的 XML 序列化”(http://msdn.microsoft.com/en-us/library/ms950721.aspx):

    问:为什么我不能序列化哈希表?

    A:XmlSerializer 无法处理 实现 IDictionary 的类 界面。这部分是由于 进度限制,部分原因是 哈希表没有的事实 在 XSD 类型中有对应物 系统。唯一的解决办法是 实现一个自定义哈希表 不实现字典 界面。

    【讨论】:

      【解决方案3】:

      我发现了同样的问题,只是将 IDictionary 类型更改为动态。

      其他一切都一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        相关资源
        最近更新 更多