ASP.NET Web服务错误地返回XML而不是JSON

时间:2011-01-30 08:53:45

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

我正在尝试使用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给了我一个解析器错误(不出意料,给出了响应)。

我的智慧结束了。我尝试添加一个ServiceType设置为JSON的ServiceMethod属性,但似乎没有任何效果。

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

3 个答案:

答案 0 :(得分:3)

没有回答SO帮我解决了这个问题。相反,我找到了两篇描述这个问题的文章。

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

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

我在这里引用:

  

$.ajax({
    type: "POST",
    url: "WebService.asmx/WebMethodName",
    data: {'fname':'dave', 'lname':'ward'},
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});

     

因为该数据参数是有效的对象文字,所以以这种方式调用Web服务不会在客户端抛出任何JavaScript错误。不幸的是,它也不会有所期望的结果。

fname=dave&lname=ward
     

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

     

$.ajax({
    type: "POST",
    url: "WebService.asmx/WebMethodName",
    data: "{'fname':'dave', 'lname':'ward'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json"
   });

     

这是语法上的一个小变化,但却有所不同。现在,jQuery将单独留下我们的JSON对象并将整个字符串传递给ASP.NET以便在服务器端进行解析。

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

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

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

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

答案 1 :(得分:2)

这是用户错误。

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

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

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

答案 2 :(得分:0)

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

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