2

在我的 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 服务。最近我决定测试并尝试从直接 URL 访问它,例如http://localhost/Services.asmx/Method

我收到了这条消息

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

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

4

3 回答 3

3

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

通过 [ScriptMethod] 向 JavaScript 公开的服务使用不同的序列化器(JavaScriptSerializer),它没有此限制。

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

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

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

于 2011-02-09T00:25:30.940 回答
1

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

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

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

A:XmlSerializer 不能处理实现 IDictionary 接口的类。这部分是由于进度限制,部分是由于哈希表在 XSD 类型系统中没有对应的事实。唯一的解决方案是实现一个不实现 IDictionary 接口的自定义哈希表。

于 2011-02-09T00:25:04.390 回答
0

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

其他一切都一样。

于 2020-05-27T22:28:15.840 回答