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

Jquery 如果ContentType不是JSON,我可以从.asmx Web服务返回JSON吗?,jquery,web-services,json,response.contenttype,Jquery,Web Services,Json,Response.contenttype,我想将一个使用ajax和jquery的表单发布到一个.asmx webservice,并将webservice中的值作为JSON返回 我正在使用ASP.NET4.0。我知道,为了从Web服务返回JSON,需要设置以下数据类型:(1)数据类型:“JSON”(2)内容类型:“application/JSON;charset=utf-8”,(3)类型:“POST”(4)将数据设置为某个值。我已经测试过了,如果所有**四个都设置好了**,那么它运行良好(即我的Web服务以JSON的形式返回数据) 但是,

我想将一个使用ajax和jquery的表单发布到一个.asmx webservice,并将webservice中的值作为JSON返回

我正在使用ASP.NET4.0。我知道,为了从Web服务返回JSON,需要设置以下数据类型:(1)数据类型:“JSON”(2)内容类型:“application/JSON;charset=utf-8”,(3)类型:“POST”(4)将数据设置为某个值。我已经测试过了,如果所有**四个都设置好了**,那么它运行良好(即我的Web服务以JSON的形式返回数据)

但是,在我的例子中,我想做一个标准的表单post,即test1=value1&test2=value2 所以contentType不是JSON,但我想要返回JSON{test1:value1}。这似乎不起作用,因为contentType是“application/x-www-form-urlencoded”而不是“application/json;charset=utf-8

谁能告诉我为什么我不能这样做?在我看来,你必须明确地 发送JSON以获取JSON,但如果您不使用JSON(即post-urlencoded contenttype),则Web服务将返回XML


非常感谢您的任何见解:)

请求和响应头是不同的故事。因此,不需要发送特定的数据类型来接收它


对于jQuery,只需使用underlaying
.ajax()
函数,并将数据类型设置为“json”。其余部分取决于调用脚本/服务。

您还应该在JSON请求中设置contentType。这将确保请求中没有对application/x-www-form-url进行编码。相反,它将提供您想要的:application/json;字符集=utf-8

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

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

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

看看我最近写的。在这篇文章中,我们询问了GET请求的示例。但几乎是一样的。唯一的区别是,编码后的数据将附加到URL(用于GET请求)。对于POST请求,将在正文中发送数据。顺便说一句,如果设置了“processData:false”(请参阅),GET数据也将在主体内部发送。请阅读我的代码示例。我希望你能收到一些想法,知道如何实施你想要的

我认为您在为.asmx webservice调用编码复杂数据时遇到了问题。以下是“复杂”数据的示例:

在哪里

在客户端

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插件) 如果需要,可以将此示例修改为HTTPPOST

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


致以最诚挚的问候

Hi Talor L,我的问题是我不想将数据发布为json,我想将其发布为urlencoded。但是,我确实希望从我的web服务返回json,但是如果我没有将contentType设置为json,我会返回xml(即使数据类型设置为json)。听起来这是web服务的一个问题。这里有一个相关的问题:嗨,詹迪,谢谢你的回复。我的问题是,如果省略contentType而设置dataType,contentType默认为urlencoded,这是正确的,但是从webservice返回的数据被编码为xml,而不是我希望的json。除非contentType也设置为json,否则数据类型似乎会被忽略。嗨,Oleg,感谢您的长响应!!经过多次尝试,我得出结论,从我的Web服务返回json数据的唯一方法是将contentType设置为“application/json”,如前所述。我决定反对这种方法,因为我不想为了发布而将简单表单序列化为json,特别是因为默认情况下并非所有浏览器都支持这样做的任何功能。最后,我决定最好的方法是使用ASP.NETMVC,它通过控制器中的JSONResult提供“开箱即用”的json支持。谢谢你的帮助:)欢迎你。我也喜欢并使用ASP.NETMVC。我决定将所有业务逻辑放在WFC中作为数据提供。这是纯粹的架构决策。但是对于您来说,ASP.NET MVC项目可能是最好的项目。ASP.NET MVC是三种最灵活的方式:WFC、MVC和.asmx webservice。祝你好运,在软件开发方面也很开心!
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);
        }
    }
});