将IDictionary对象传递给Web服务

时间:2011-02-08 23:45:07

标签: web-services idictionary

在我的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

这样的直接网址访问它

我收到此消息

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

这似乎关闭了。是什么造成的,这是正常的吗?我很困惑 - 这似乎是干净的做事方式,但根据微软的说法不应该这样做,但它确实有效,但不能直接访问网络服务。是什么赋予了?我还在一些MS网站上读到你不能将IDictionary作为参数传递给Web服务但它工作正常......那么它可以做到或不做?有人可以一劳永逸地澄清这一点吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

作为旁注,WCF中改进的序列化程序支持字典的序列化。

答案 1 :(得分:1)

ASMX Webservices使用XmlSerializer序列化和反序列化对象,并且没有一种很好的方法可以在适当的XML模式中表示Dictionary。不幸的是,除了将你的IDictionary转换为可以由XmlSerializer序列化的另一种类型的对象之外,我认为还有一个好办法。

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

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

     

答:XmlSerializer无法处理   实现IDictionary的类   接口。这部分是由于   安排约束和部分原因   事实上哈希表没有   有一个XSD类型的对应物   系统。唯一的解决方案是   实现一个自定义哈希表   没有实现IDictionary   接口

答案 2 :(得分:0)

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

其他所有东西都一样。