我正在尝试使用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生成器,所以请不要建议使用它们。
答案 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()