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

我想用ajax和jquery发布一个表单到.asmx webservice,并以web服务的值作为JSON返回。

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

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

谁能告诉我为什么我不能这样做? 我觉得你必须明确地发送JSON才能获得JSON,但如果你不使用JSON(即,发布urlencoded内容类型),那么web服务将返回XML。

任何见解都非常感谢:)


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

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

看看最近编写的httpget webmethod(c#)的JQuery ajax调用不起作用。 在这篇文章中被问到GET请求的例子。 但它几乎是一样的。 唯一的区别是,编码后的数据将被附加到URL(用于GET请求)。 对于POST请求, 数据将在主体中发送。 顺便说一句,如果一个设置“processData:false”(请参阅​​http://api.jquery.com/jQuery.ajax/),GET数据也会发送到body的内部。 所以阅读我的代码示例从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。

还有一点小建议。 如果你使用jQuery 1.4.x,你可以尝试使用'none'作为dataType。 请参阅文档:“如果没有指定,jQuery将根据响应的MIME类型智能地尝试获取结果(XML MIME类型将生成XML,在1.4 JSON中将生成一个JavaScript对象,在1.4脚本中将执行脚本和其他任何东西将作为字符串返回)“

最好的祝福


您还应该在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 */
    }
});

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

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

链接地址: http://www.djcxy.com/p/46169.html

上一篇: Can I return JSON from an .asmx Web Service if the ContentType is not JSON?

下一篇: Ajax login issues