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

时间:2022-10-30 23:23:24

I would like to post a form using ajax and jquery to a .asmx webservice and return the value from the webservice as JSON.

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

I'm using ASP.NET 4.0. I know that in order to return JSON from a webservice the following needs to be set (1) dataType: "json" (2) contentType: "application/json; charset=utf-8", (3) type: "POST" (4) set the Data to something. I have tested this and it works fine (i.e. my webservice returns the data as JSON) if all **four are set**.

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

But, lets say in my case I want to do a standard form post i.e. test1=value1&test2=value2 so the contentType is not JSON but I want back JSON {test1:value1}. This doesn't seem to work because the contentType is "application/x-www-form-urlencoded" not "application/json; charset=utf-8".

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

Can anyone tell me why I can't do this? It seems crazy to me that you have to explicitly send JSON to get JSON back, yet if you don't use JSON (i.e. post urlencoded contenttype) then the webservice will return XML.

谁能告诉我为什么我不能这样做?我必须明确发送JSON以获取JSON,但是如果你不使用JSON(即发布urlencoded contenttype),那么webservice将返回XML。

Any insights are greatly appreciated :)

任何见解都非常感谢:)

3 个解决方案

#1


7  

If you will use WFC RESTfull Service instead of .asmx webservice you can implement all your requirements from your question. But usage of .asmx webservice with JSON as output required that you use at least contentType: 'application/json'. In different places you can find as a reason - security reason (see JSON Hijacking).

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

Probably 'x-www-form-urlencoded' is not your real problem. If you use dataType: "json" the parameters will be also send in the form "test1=value1&test2=value2"!!! The only difference, that all values should be JSON encoded. And jQuery don't makes JSON encoding of the data. (You can look in the code of jQuery.) The main difference is only that "Accept: application/json" will be explicitly set in the request header.

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

Look at JQuery ajax call to httpget webmethod (c#) not working which I wrote recently. In this post was asked example of GET request. But it is almost the same. The only difference is, that data after encoding will be appended to the URL (for GET request). For POST request the data will be send in body. By the way if one set "processData: false" (see http://api.jquery.com/jQuery.ajax/) the GET data will be also send inside of body. So read my code example from JQuery ajax call to httpget webmethod (c#) not working. I hope you receive ideas how you can implement what you will.

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

I think you had problems with encoding complex data for your .asmx webservice call. Here is example with "complex" data:

我认为您在为.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 } }
    };
}

where

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; }
}

and on the client side

在客户端

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 come from the JSON plugin ) You can modify this example to HTTP POST, if you want.

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

One more small advice. If you use jQuery 1.4.x you can try use 'none' as dataType. See documentation: "If none is specified, jQuery will intelligently try to get the results, based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string)"

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

Best regards

#2


1  

You should also set the contentType in the JSON request as well. This will ensure you don't have application/x-www-form-urlencoded in the request. Instead, it will give you want you want: application/json; charset=utf-8.

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

#3


1  

Request and response headers are different storys. Thus, it's not necessary to send a specific datatype in order to receive it.

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

In the case of jQuery, just use the underlaying .ajax() function with dataType set to 'json'. The rest depends on your calling script/service.

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

#1


7  

If you will use WFC RESTfull Service instead of .asmx webservice you can implement all your requirements from your question. But usage of .asmx webservice with JSON as output required that you use at least contentType: 'application/json'. In different places you can find as a reason - security reason (see JSON Hijacking).

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

Probably 'x-www-form-urlencoded' is not your real problem. If you use dataType: "json" the parameters will be also send in the form "test1=value1&test2=value2"!!! The only difference, that all values should be JSON encoded. And jQuery don't makes JSON encoding of the data. (You can look in the code of jQuery.) The main difference is only that "Accept: application/json" will be explicitly set in the request header.

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

Look at JQuery ajax call to httpget webmethod (c#) not working which I wrote recently. In this post was asked example of GET request. But it is almost the same. The only difference is, that data after encoding will be appended to the URL (for GET request). For POST request the data will be send in body. By the way if one set "processData: false" (see http://api.jquery.com/jQuery.ajax/) the GET data will be also send inside of body. So read my code example from JQuery ajax call to httpget webmethod (c#) not working. I hope you receive ideas how you can implement what you will.

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

I think you had problems with encoding complex data for your .asmx webservice call. Here is example with "complex" data:

我认为您在为.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 } }
    };
}

where

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; }
}

and on the client side

在客户端

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 come from the JSON plugin ) You can modify this example to HTTP POST, if you want.

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

One more small advice. If you use jQuery 1.4.x you can try use 'none' as dataType. See documentation: "If none is specified, jQuery will intelligently try to get the results, based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string)"

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

Best regards

#2


1  

You should also set the contentType in the JSON request as well. This will ensure you don't have application/x-www-form-urlencoded in the request. Instead, it will give you want you want: application/json; charset=utf-8.

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

#3


1  

Request and response headers are different storys. Thus, it's not necessary to send a specific datatype in order to receive it.

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

In the case of jQuery, just use the underlaying .ajax() function with dataType set to 'json'. The rest depends on your calling script/service.

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