我创建了一个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" };
}
}
从WebService的返回XML即使ResponseFormat设置为JSON :
确保请求是POST请求,而不是GET。 斯科特格思里有一个文章,解释为什么 。
虽然它的jQuery编写的,这也可能对你有用:
使用jQuery消费ASP.NET的JSON Web服务
要获得一个纯粹的JSON字符串,而不会被包裹成一个XML,你必须直接写JSON字符串到HttpResponse
和更改WebMethod
返回类型void
。
[System.Web.Script.Services.ScriptService]
public class WebServiceClass : System.Web.Services.WebService {
[WebMethod]
public void WebMethodName()
{
HttpContext.Current.Response.Write("{property: value}");
}
}
这可能是旧闻现在,但魔术似乎是:
- [ScriptService]上的web服务类属性
- [ScriptMethod(UseHttpGet =真,ResponseFormat = ResponseFormat.Json)]对方法
- 内容类型:应用/ JSON在请求
有了这些作品,GET请求是成功的。
对于HTTP POST
- [ScriptMethod(UseHttpGet =假,ResponseFormat = ResponseFormat.Json)]对方法
并在客户端(假设你的WebMethod被调用方法名,它需要所谓的搜索字符串一个参数):
$.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);
}
});
快速疑难杂症,我学到了艰辛的道路(主要是在谷歌花费4小时),你可以使用PageMethods在你的ASPX文件,以返回JSON(与[ScriptMethod()]标记)的静态方法,但是如果你决定移动您的静态方法的ASMX文件,它不能是一个静态方法。
此外,你需要告诉Web服务内容类型:应用程序/ JSON,以获得JSON从调用(我使用jQuery和后3个误区,以避免在使用jQuery文章是很有启发性-来自同一个网站的在另一种答案这里提到)。
你打电话从客户端脚本或服务器端的Web服务?
您可能会发现发送内容类型标题到服务器会有帮助,例如,
“应用程序/ JSON; 字符集= UTF-8'
在客户端,我使用的原型客户端库,并调用Ajax在那里你可以指定这个时候有一个参数的contentType。 我认为jQuery有一个方法的getJSON。
另一种方法:使用通用HTTP处理程序(ashx的),并使用自己喜欢的JSON库手动序列化和反序列化JSON的。
我发现了一个请求的处理是完全控制,并生成响应击败其他任何.NET提供了简单,RESTful Web服务。