如果 ContentType 不是 JSON,我可以从 .asmx Web 服务返回 JSON 吗? [英] Can I return JSON from an .asmx Web Service if the ContentType is not JSON?

查看:30
本文介绍了如果 ContentType 不是 JSON,我可以从 .asmx Web 服务返回 JSON 吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将使用 ajax 和 jquery 的表单发布到 .asmx 网络服务,并将网络服务的值作为 JSON 返回.

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

我使用的是 ASP.NET 4.0.我知道为了从网络服务返回 JSON,需要设置以下内容 (1) dataType: "json" (2) contentType: "application/json; charset=utf-8", (3) type: "POST"(4) 将数据设置为某物.我已经测试过了,它工作正常(即我的网络服务以 JSON 形式返回数据)如果所有 **4 都设置了**.

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**.

但是,假设在我的情况下,我想做一个标准的表单发布,即 test1=value1&test2=value2所以 contentType 不是 JSON 但我想要返回 JSON {test1:value1}.这似乎不起作用,因为 contentType 是application/x-www-form-urlencoded"而不是application/json; charset=utf-8".

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".

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

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.

非常感谢任何见解:)

推荐答案

如果您将使用 WFC RESTfull 服务而不是 .asmx webservice,您可以根据您的问题实现您的所有要求.但是使用 .asmx 网络服务和 JSON 作为输出必需,您至少使用 contentType: 'application/json'.在不同的地方你可以找到一个原因——安全原因(参见 JSON Hijacking).

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).

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

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

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.

我认为您在为 .asmx 网络服务调用编码复杂数据时遇到了问题.这是复杂"数据的示例:

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

[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.

($.toJSON come from the JSON plugin ) You can modify this example to HTTP POST, if you want.

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

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)"

最好的问候

这篇关于如果 ContentType 不是 JSON,我可以从 .asmx Web 服务返回 JSON 吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆