题
我创建了一个带有代码隐藏文件的 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" };
}
}
解决方案
从即使ResponseFormat设置为JSON ,WebService也返回XML:
确保请求是POST请求,而不是GET。 Scott Guthrie有一个解释原因。
虽然它是专门为jQuery编写的,但这对你也很有用:
使用jQuery来使用ASP.NET JSON Web服务
其他提示
要接收纯JSON字符串,而不将其包装到XML中,您必须将JSON字符串直接写入 HttpResponse
并将 WebMethod
返回类型更改为<代码>空隙代码>
[System.Web.Script.Services.ScriptService]
public class WebServiceClass : System.Web.Services.WebService {
[WebMethod]
public void WebMethodName()
{
HttpContext.Current.Response.Write("{property: value}");
}
}
这可能已经是老新闻了,但神奇之处似乎在于:
- Web 服务类的 [ScriptService] 属性
- [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 方法
- 内容类型:请求中的 application/json
这些部分就位后,GET 请求就会成功。
对于 HTTP POST
- [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] 方法
在客户端(假设您的 webmethod 名为 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);
}
});
我学到了很多困难(基本上花了4个小时在谷歌上),你可以在ASPX文件中使用PageMethods返回JSON(带有[ScriptMethod()]标记)用于静态方法,但是如果你决定将静态方法移动到asmx文件,它不能是静态方法。
此外,您需要告诉Web服务Content-Type:application / json以便从调用中恢复JSON(我正在使用jQuery和 3使用jQuery时要避免的错误文章非常具有启发性 - 来自在另一个答案中提到的同一个网站)。
您是从客户端脚本还是在服务器端调用Web服务?
您可能会发现向服务器发送内容类型标题会有所帮助,例如:
“应用/ JSON;字符集= UTF-8'
在客户端,我使用原型客户端库,并且在进行Ajax调用时有一个contentType参数,您可以在其中指定它。我认为jQuery有一个getJSON方法。
替代方法:使用通用HTTP处理程序(.ashx)并使用您喜欢的json库手动序列化和反序列化您的JSON。
我发现对请求的处理和生成响应的完全控制优于.NET为简单的RESTful Web服务提供的任何其他功能。