【问题标题】:ASP.NET web service erroneously returns XML instead of JSONASP.NET Web 服务错误地返回 XML 而不是 JSON
【发布时间】:2011-06-18 00:58:30
【问题描述】:

我正在尝试通过使用 jQuery 的 javascript 使用 ASMX Web 服务。当我要求 XML 时它工作正常,但我想利用 .net 的 JSON 序列化功能; (它也开始让我觉得这不起作用)

网络服务的代码:

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;

[WebService()]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class SimpleService : WebService
{
    [WebMethod]
    public String GetString()
    {
        return "value";
    }
}

客户端代码:

$.ajax({
  type: "POST",
  url: "SimpleService.asmx/GetString",
  data: "{}",
  contentType: "application/json; charset=utf-8",
  dataType: "json"
});

然后响应...

Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET

<?xml version="1.0" encoding="utf-8"?><string xmlns="http://tempuri.org/">value</string>

请求总是成功,但是 jQuery 给了我一个解析器错误(毫不奇怪,鉴于响应)。

我已经束手无策了。我尝试添加一个将 ResponseType 设置为 JSON 的 ServiceMethod 属性,但似乎没有任何效果。

我也不想使用 .NET ScriptManager javascript 生成器,所以请不要建议使用它们。

【问题讨论】:

    标签: web-services json asp.net-ajax asmx


    【解决方案1】:

    没有关于 SO 的答案帮助我解决了这个问题。相反,我找到了 2 篇描述此问题的文章。

    jQuery 不会将请求数据编码为 JSON,而是编码为查询字符串。这会导致 ASP.NET 忽略 Accept 标头并使用 XML 进行响应。

    检查标题“JSON、对象和字符串:哦,我的!”处的 this article

    我在这里引用:

    $.ajax({
        类型:“发布”,
        url: "WebService.asmx/WebMethodName",
        数据:{'fname':'dave', 'lname':'ward'},
        contentType: "应用程序/json; charset=utf-8",
        数据类型:“json”
    });

    因为 data 参数是一个有效的对象字面量,所以以这种方式调用 Web 服务不会在客户端引发任何 JavaScript 错误。不幸的是,它也不会得到想要的结果。

    fname=dave&lname=ward
    

    这显然不是我们想要发生的。解决方案是确保您向 jQuery 传递数据参数的字符串,如下所示:

    $.ajax({
        类型:“发布”,
        url: "WebService.asmx/WebMethodName",
        数据:“{'fname':'dave', 'lname':'ward'}”,
        contentType: "应用程序/json; charset=utf-8",
        数据类型:“json”
       });

    这是语法上的一个小变化,但会产生很大的不同。现在,jQuery 将不理会我们的 JSON 对象,并将整个字符串传递给 ASP.NET,以便在服务器端进行解析。

    在我的情况下,数据参数是一个大对象,所以我使用类似的东西手动将其序列化为 JSON。

    data: JSON.stringify({'fname':'dave', 'lname':'ward'}),
    

    让 ASP.NET ScriptService 在从 jQuery 查询时返回 JSON 非常棘手,并且代码中的许多参数可能使其抛出 XML 而不是 JSON。您应该阅读各种 SO Q/A 以获得满意。

    Related article form the same author 可能会提供更多指导。

    【讨论】:

      【解决方案2】:

      这是用户错误。

      我刚刚偶然发现了另一个 stackoverflow 问题:web-service returning xml instead of json in net 4-0

      结果证明我需要一个类似的解决方案。 web.config 文件有一个用于 IIS6 的 ScriptHandlerFactory 的 httpHandler 映射,而我使用的是 IIS7。将 httpHandler 映射添加到 web.config 的 IIS7 部分解决了这个问题。

      我讨厌隐藏的移动部件......

      【讨论】:

        【解决方案3】:

        尝试将[ScriptMethod] 属性添加到方法中:

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public String GetString()
        

        【讨论】:

        猜你喜欢
        • 2012-02-26
        • 2023-04-05
        • 2012-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多