我创建了一个带有代码隐藏文件的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" }; } }
小智.. 53
要接收纯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}"); } }
Pavel Chuchu.. 39
从 WebService的返回XML即使ResponseFormat设置为JSON:
确保请求是POST请求,而不是GET.Scott Guthrie有一篇文章解释了原因.
虽然它是专门为jQuery编写的,但这对您也很有用:
使用jQuery来使用ASP.NET JSON Web服务
您也可以添加以下注释[ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]公共字符串TestData()以在您的Web服务中启用GET (7认同)
我不同意POST请求在这里是合适的.端点不期望数据,OP不向服务器发送任何数据(与Scott G的帖子不同),当然也不打算更改服务器上的数据.事实上,OP具有正确的ScriptMethod属性以允许GET请求 - UseHttpGet = true.他们只是调用一个端点来"获取"一些数据.GET请求很好 - 所有缺少的是在请求中设置Content-Type,请参阅下面的答案. (3认同)
marc.. 15
这可能是现在的老消息,但魔术似乎是:
Web服务类的[ScriptService]属性
[ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)] on方法
内容类型:请求中的application/json
有了这些部分,GET请求就会成功.
对于HTTP POST
[ScriptMethod(UseHttpGet = false,ResponseFormat = ResponseFormat.Json)] on方法
在客户端(假设您的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); } });
为什么在世界上需要将`Content-type`设置为`application/json`?不应该`[ScriptMethod(ResponseFormat = ResponseFormat.Json)]`自动执行此操作?难以置信的.谢谢你的研究. (3认同)
Bryan Rehbei.. 9
我学到了很多困难的方法(基本上花了4个小时在谷歌上),你可以在你的ASPX文件中使用PageMethods来返回静态方法的JSON(带有[ScriptMethod()]标记),但是如果你决定移动你的静态方法到一个asmx文件,它不能是一个静态方法.
此外,您需要告诉Web服务Content-Type:application/json以便从调用中恢复JSON(我使用jQuery和使用jQuery时要避免的3个错误文章非常有启发性 - 它来自同一个网站在这里的另一个答案中提到).
要接收纯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}"); } }
从 WebService的返回XML即使ResponseFormat设置为JSON:
确保请求是POST请求,而不是GET.Scott Guthrie有一篇文章解释了原因.
虽然它是专门为jQuery编写的,但这对您也很有用:
使用jQuery来使用ASP.NET JSON Web服务
这可能是现在的老消息,但魔术似乎是:
Web服务类的[ScriptService]属性
[ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)] on方法
内容类型:请求中的application/json
有了这些部分,GET请求就会成功.
对于HTTP POST
[ScriptMethod(UseHttpGet = false,ResponseFormat = ResponseFormat.Json)] on方法
在客户端(假设您的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和使用jQuery时要避免的3个错误文章非常有启发性 - 它来自同一个网站在这里的另一个答案中提到).