64

我创建了一个带有代码隐藏文件的 ASMX 文件。它工作正常,但它正在输出 XML。

但是,我需要它来输出 JSON。ResponseFormat 配置似乎不起作用。我的代码隐藏是:

[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService {
    [WebMethod]
    [ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
    public string[] UserDetails()
    {
        return new string[] { "abc", "def" };
    }
}
4

6 回答 6

58

要接收纯 JSON 字符串,而不将其包装到 XML 中,您必须将 JSON 字符串直接写入 并将返回类型HttpResponse更改为.WebMethodvoid

    [System.Web.Script.Services.ScriptService]
    public class WebServiceClass : System.Web.Services.WebService {
        [WebMethod]
        public void WebMethodName()
        {
            HttpContext.Current.Response.Write("{property: value}");
        }
    }
于 2012-11-22T11:32:46.763 回答
39

即使 ResponseFormat 设置为 JSON,WebService 也会返回XML :

确保请求是 POST 请求,而不是 GET。Scott Guthrie 有一篇文章解释了原因

虽然它是专门为 jQuery 编写的,但这也可能对您有用:
Using jQuery to Consume ASP.NET JSON Web Services

于 2008-10-17T10:36:24.997 回答
17

这可能是现在的老新闻,但神奇的似乎是:

  • Web 服务类的 [ScriptService] 属性
  • [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 方法
  • 内容类型:请求中的应用程序/json

有了这些部分,GET 请求就成功了。

对于 HTTP POST

  • [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] 方法

在客户端(假设您的 web 方法称为 MethodName,并且它需要一个名为 searchString 的参数):

        $.ajax({
            url: "MyWebService.asmx/MethodName",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify({ searchString: q }),
            success: function (response) {                  
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + ": " + jqXHR.responseText);
            }
        });
于 2012-04-18T16:48:03.907 回答
9

我通过艰难的方式学到了一个快速的问题(基本上在 Google 上花了 4 个小时),您可以在 ASPX 文件中使用 PageMethods 为静态方法返回 JSON(带有 [ScriptMethod()] 标记),但是如果您决定移动您对 asmx 文件的静态方法,它不能是静态方法。

此外,您需要告诉 Web 服务 Content-Type: application/json 以便从调用中获取 JSON(我正在使用 jQuery 并且使用 jQuery时要避免的 3 个错误文章非常有启发性 - 它来自同一个网站在这里的另一个答案中提到)。

于 2008-10-21T21:19:34.353 回答
4

您是从客户端脚本还是在服务器端调用 Web 服务?

您可能会发现向服务器发送内容类型标头会有所帮助,例如

'应用程序/json; 字符集=utf-8'

在客户端,我使用原型客户端库,并且在进行 Ajax 调用时有一个 contentType 参数,您可以在其中指定它。我认为 jQuery 有一个 getJSON 方法。

于 2008-10-17T10:38:54.133 回答
4

替代方案:使用通用 HTTP 处理程序 (.ashx) 并使用您最喜欢的 json 库手动序列化和反序列化您的 JSON。

我发现对请求处理和生成响应的完全控制胜过 .NET 为简单的 RESTful Web 服务提供的任何其他功能。

于 2012-09-10T20:47:07.920 回答