如果ContentType不是JSON,我可以从.asmx Web服务返回JSON吗?

我想用ajax和jquery发布一个表单到一个.asmx web服务,然后从web服务返回值作为JSON。

我正在使用ASP.NET 4.0。 (1)dataType:“json”(2)contentType:“application / json; charset = utf-8”,(3)type:“POST” (4)将数据设置为某物。 我已经testing了这个,它工作正常(即我的web服务返回数据为JSON), 如果所有**四个设置**。

但是,让我说在我的情况下,我想要做一个标准的forms后,即test1 = value1&test2 = value2所以contentType不是JSON,但我想要回JSON {test1:value1}。 这似乎不工作,因为contentType是“ application / x-www-form-urlencoded ”而不是“ application / json; charset = utf-8 ”。

谁能告诉我为什么我不能这样做? 我似乎很疯狂,你必须明确发送JSON来获取JSON,但如果你不使用JSON(即后urlencoded内容types),那么web服务将返回XML。

任何见解都非常感谢:)

如果您将使用WFC RESTfull服务而不是.asmx webservice,则可以实现您的问题中的所有需求。 但是使用带有JSON的.asmx webservice作为输出,至less需要使用contentType: 'application/json' 。 在不同的地方,你可以find一个理由 – 安全原因(见JSON劫持)。

可能是'x-www-form-urlencoded'不是你真正的问题。 如果使用dataType: "json" ,参数也将以“test1 = value1&test2 = value2”的forms发送! 唯一的区别是,所有的值都应该是JSON编码的。 而jQuery 不会对数据进行JSON编码 。 (你可以看看jQuery的代码。)主要区别只是在请求头中显式设置“Accept:application / json”。

看看jQuery ajax调用httpget webmethod(c#)不工作 ,我最近写了。 在这个post被问到GET请求的例子。 但它几乎是一样的。 唯一的区别是,编码后的数据将被附加到URL(用于GET请求)。 对于POST请求, 数据将被正式发送。 顺便说一句,如果一个设置“processData:false”(见http://api.jquery.com/jQuery.ajax/),GET数据也将被发送到主体内部。; 所以阅读我的代码示例从jQuery ajax调用httpget webmethod(c#)不工作 。 我希望你能得到你如何实现你的想法。

我认为你在为.asmx webservice调用编码复杂数据时遇到了问题。 这里是“复杂”数据的例子:

 [WebMethod] [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public OutputData AjaxGetMore (InputData input) { return new OutputData () { id = input.id, message = new List { "it's work!", "OK!" }, myInt = new int[] { input.myInt[0] + 1, input.myInt[1] + 1, 20, 75 }, myComplexData = new InternalData () { blaBla = "haha", iii = new int[] { 1, 2, 3, 4, 5 } } }; } 

哪里

 public class InternalData { public string blaBla { get; set; } public int[] iii { get; set; } } public class OutputData { public string id { get; set; } public List message { get; set; } public int[] myInt { get; set; } public InternalData myComplexData { get; set; } } public class InputData { public string id { get; set; } public int[] myInt { get; set; } public InternalData data { get; set; } } 

并在客户端

 var myData = { id: "li1234", myInt: [100, 200], data : {blaBla: "Hahhh!", iii: [10,20,30]}} var myDataForjQuery = {input:$.toJSON(myData)}; $.ajax({ type: "GET", url: "/Service1.asmx/AjaxGetMore", // + idAsJson, data: myDataForjQuery, // idAsJson, //myData, dataType: "json", contentType: "application/json; charset=utf-8", success: function(msg) { // var msg = {__type: "Testportal.outputData", id: "li1234", message: "it's work!", myInt:101} alert("message=" + msg.d.message + ", id=" + msg.d.id + ", myInt=" + msg.d.myInt); }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } }); 

$.toJSON来自JSON插件)如果需要,可以将此示例修改为HTTP POST。

多一个小build议。 如果你使用jQuery 1.4.x,你可以尝试使用'none'作为dataType。 请参阅文档:“如果没有指定,jQuery将智能地尝试获取结果,基于响应的MIMEtypes(一个XML MIMEtypes将产生XML,在1.4 JSON将产生一个JavaScript对象,在1.4脚本将执行脚本,其他任何东西都会作为string返回)“

最好的祝福

您还应该在JSON请求中设置contentType。 这将确保您的请求中没有application / x-www-form-urlencoded。 相反,它会给你想要的:application / json; 字符集= UTF-8。

 $.ajax({ url: '/your/site', contentType: 'application/json', dataType: 'json', data: jsonString, type: 'post', success: function (data) { /* do stuff */ } }); 

请求和响应头是不同的存储。 因此,没有必要发送一个特定的数据types来接收它。

在jQuery的情况下,只需使用底层的.ajax()函数,将dataType设置为“json”。 其余的取决于你的调用脚本/服务。