在我的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服务但它工作正常......那么它可以做到或不做?有人可以一劳永逸地澄清这一点吗?
答案 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。
其他所有东西都一样。