【问题标题】:How to return JSON from a 2.0 asmx web service如何从 2.0 asmx Web 服务返回 JSON
【发布时间】:2010-09-22 06:39:03
【问题描述】:

我正在使用 .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 解决方案。

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 遗憾的是,该 encosia 链接现在在我的浏览器中触发了攻击页面警告。
【解决方案2】:

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

[WebMethod(Description="return pure JSON")]
public void retrieveByIdToPureJSON( int id )
{
  Context.Response.Write( JsonConvert.SerializeObject( mydbtable.getById(id) );
}

祝你好运,汤姆

顺便说一句:JsonConvert 参见 Newtonsoft.Json

【讨论】:

  • 就这么简单。从 Function 更改为 Sub(在 Vb.net 中)并删除返回但使用 response.write 输出。 2 周尝试各种事情来摆脱那个讨厌的 当我返回时。拯救了我的一天。 Tnxs
  • 我现在想拥抱你,花了我几个小时才找到你的解决方案:)
【解决方案3】:

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

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

其余的你都做对了 :)

更多信息请访问EncosiaAndrew Roland's Blog

编辑:如下所述,这只是 .NET 3.5(我没有意识到这一点,我的错)。

【讨论】:

  • 仅从 3.5 开始支持 'ResponseFormat' 枚举,OP 询问如何在 FW 2.0 中执行。
  • @Omu 原始发帖人与提出问题的人一样(或在论坛中发起该主题的人)
【解决方案4】:

您可能无法在 .NET 2.0 中执行 XML 或二进制序列化之外的任何操作。如果您不使用自动生成的 Web 参考,那么不要打扰 ASMX。只需改用 ASPX 或 ASHX。

【讨论】:

    【解决方案5】:

    您可以使用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!";
            }
        }
    }
    

    【讨论】:

    • 我实际上认为这是一个可能的解决方案,如果我不能用普通的 'ol asp.net 做到这一点。谢谢。
    【解决方案6】:

    也可以使用 Refelction 编写自己的快速 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("}")    
    

    【讨论】:

      【解决方案7】:

      我可能不是 100% 正确,但我确信 .net 网络服务是基于 XML/SOAP 的。

      您需要覆盖网络服务的默认行为。我不完全确定这是否可能。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 2011-02-09
        • 2012-07-11
        相关资源
        最近更新 更多