我有以下网络方法:
<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=True, XmlSerializeString:=True)> _
Public Function GetDictionary() As Dictionary(Of String, String)
Dim d As New Dictionary(Of String, String)
d.Add("key1", "value1")
d.Add("key2", "value2")
Return d
End Function
如果我在我的ajax调用中使用HttpPost,我可以很好地检索结果(JSON),但是一旦我使用HttpGet,我就会得到以下异常:
System.NotSupportedException:类型System.Collections.Generic.Dictionary`2 [[System.String,mscorlib ,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.String,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]不受支持,因为它实现了IDictionary
我想在这里使用HttpGet,以便可以缓存结果。
我尝试了所有调用它的变体,但没有运气。有任何想法吗?这可能与GET有关吗?
答案 0 :(得分:1)
我有点困惑 - 如果ResponseFormat是JSON(如上例所示),那么IDictionary派生should be supported,但如果它是XML,那么我可以理解看到这个错误,因为XmlSerializer不支持这个。
使用XmlSerializer发送字典类型的一个选项是实现逻辑以将其转换为数组或List或ArrayList。或者,您可以为数据实现自定义序列化程序并编写自己的XML,从而从您的方法返回XmlDocument。这将允许您以您选择的任何方式格式化数据。
也许您可以澄清您是使用JSON还是XML?
答案 1 :(得分:1)
另一种方法是将Return类型更改为String,然后通过JavaScriptSerializer.Serialize将Dictionary转换为JSON。这可能不是你想要返回一个字典,但它将是JSON Response中的key = value对。
<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=True, XmlSerializeString:=True)> _
Public Function GetDictionary() As String
Dim d As New Dictionary(Of String, String)
d.Add("key1", "value1")
d.Add("key2", "value2")
Return New JavaScriptSerializer().Serialize(d)
End Function
结果JSON:
{"key1":"value1","key2":"value2"}