如何从2.0 asmx Web服务返回JSON

时间:2008-11-14 00:12:09

标签: jquery .net asp.net ajax web-services

我正在使用.Net framework 2.0 / jQuery来对2.0 Web服务进行Ajax调用。无论我在ajax调用中将contentType设置为什么,服务始终返回XML。我想让它回归Json!

这是电话:

      $(document).ready(function() {
         $.ajax({
            type: "POST",
            url: "DonationsService.asmx/GetDate",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
              // Hide the fake progress indicator graphic.
              $('#RSSContent').removeClass('loading');

              // Insert the returned HTML into the <div>.
              $('#RSSContent').html(msg.d);
            }
          });
        });    

以下是Fiddler中请求标头的样子:

POST /DonationsService.asmx/GetDate HTTP/1.1
x-requested-with: XMLHttpRequest
Accept-Language: en-us
Referer: http://localhost:1238/text.htm
Accept: application/json, text/javascript, */*
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; eMusic DLM/4; .NET CLR 2.0.50727)
Host: localhost:1238
Content-Length: 2
Connection: Keep-Alive
Pragma: no-cache

我尝试将contentType设置为'text / json'并获得相同的结果。

以下是Web服务方法:

<WebMethod()> _
Public Function GetDate() As String

    'just playing around with Newtonsoft.Json
    Dim sb As New StringBuilder
    Dim sw As New IO.StringWriter(sb)
    Dim strOut As String = String.Empty

    Using jw As New JsonTextWriter(sw)
        With jw
            .WriteStartObject()
            .WritePropertyName("DateTime")
            .WriteValue(DateTime.Now.ToString)
            .WriteEndObject()
        End With
        strOut = sw.ToString
    End Using

    Return strOut

End Function

以下是它的回报:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://DMS.Webservices.org/">{"DateTime":"11/13/2008 6:04:22 PM"}</string>

当我要求Json时,有谁知道如何强制Web服务返回Json?

请不要告诉我升级到.Net Framework 3.5或类似的东西(我不是那么愚蠢)。我需要2.0解决方案。

7 个答案:

答案 0 :(得分:35)

return JSON from ASMX services in ASP.NET 2.0没问题。您只需要安装ASP.NET AJAX Extensions。

请确保将[ScriptService]装饰添加到您的Web服务中。这就是指示ASP.NET AJAX框架的服务器端部分为正确形成的请求返回JSON。

另外,如果您在2.0中使用它,则需要在我的示例中删除“msd.d”中的“.d”。 The ".d" is a security feature that came with 3.5

答案 1 :(得分:11)

响应包含在一个元素中,因为你的方法说它会返回一个字符串。你可以使用它来发送普通的json,但是你的wsdl会被愚弄(函数是无效的但是会响应数据)。

[WebMethod(Description="return pure JSON")]
public void retrieveByIdToPureJSON( int id )
{
  Context.Response.Write( JsonConvert.SerializeObject( mydbtable.getById(id) );
}
祝你好运,汤姆

顺便说一句:请参阅Newtonoft.Json获取JsonConvert

答案 2 :(得分:10)

您需要使用以下内容装饰您的网络方法:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

你有其余的权利:)

有关EncosiaAndrew Roland's Blog

的更多信息

编辑:如下所述,这只是.NET 3.5(我不知道这一点,我的不好)。

答案 3 :(得分:2)

除了.NET 2.0中的XML或二进制序列化之外,您可能无法执行任何操作。如果您没有使用自动生成的Web引用,请不要使用ASMX。只需使用ASPX或ASHX。

答案 4 :(得分:2)

您可以使用Jayrock library Quick start for asp.net

这允许你编写一个http处理程序来返回json。

<%@ WebHandler Class="JayrockWeb.HelloWorld" %>

namespace JayrockWeb
{
    using System;
    using System.Web;
    using Jayrock.Json;
    using Jayrock.JsonRpc;
    using Jayrock.JsonRpc.Web;

    public class HelloWorld : JsonRpcHandler
    {
        [ JsonRpcMethod("greetings") ]
        public string Greetings()
        {
            return "Welcome to Jayrock!";
        }
    }
}

答案 5 :(得分:1)

也可以使用Reflection编写自己的快速JSON转换器。

Dim sb As New StringBuilder("{")
For Each p As PropertyInfo In myObject.GetType().GetProperties()
    sb.Append(String.Format("""{0}"":""{1}"",", p.Name, p.GetValue(myObject,  
              Nothing).ToString()))
Next p

//remove the last "," because it's uneeded.
sb.Remove(sb.Length - 1, 1)

sb.Append("}")    

答案 6 :(得分:0)

我可能不是100%正确,但我确定.net webservices是基于XML / SOAP的。

您需要覆盖Web服务的默认行为。我不完全确定这甚至是可能的。

我知道这不是最有用的答案,但可能会让你朝着正确的方向前进。