如何从 2.0 asmx Web 服务返回 JSON

Posted

技术标签:

【中文标题】如何从 2.0 asmx Web 服务返回 JSON【英文标题】:How to return JSON from a 2.0 asmx web service 【发布时间】: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 解决方案。

【问题讨论】:

也许你可以使用我的解决方案; ***.com/questions/26140330/… 你可以试试我的解决方案; ***.com/questions/26140330/… 【参考方案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)]

其余的你都做对了 :) 更多信息请访问Encosia 和 Andrew 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 的。

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

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

【讨论】:

以上是关于如何从 2.0 asmx Web 服务返回 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 asmx 端点?

从 Web 服务 (ASMX) 调用第三方 API

如何使用 iOS SDK 从 ASMX Web 服务中获取和解析 JSON?

如何从 asmx Web 服务管理多个 ado.net 数据库连接

asp.net asmx Web 服务返回 xml 而不是 json

webservices 更改 ASMX Web 服务返回的命名空间前缀