无法通过GET ajax web请求返回Dictionary(Of String,String),适用于POST

时间:2009-06-23 15:28:26

标签: .net vb.net ajax jquery

我有以下网络方法:

    <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有关吗?

2 个答案:

答案 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"}