通过跨域发布未定义JSONP数据

时间:2013-01-18 11:44:53

标签: jquery .net json web-services jsonp

我正在尝试将来自jquery $ .ajax方法的请求发送到我在其他域上创建的.net Web服务。我已经尝试了很多东西,但我仍然无法将其付诸实践。我不断得到的回应是未定义的。

有人可以提出建议吗?

由于

.NET代码

public class Handler1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            string callback = "";
            try
            {
                if (!string.IsNullOrEmpty(context.Request["callback"]))
                {
                    if (!string.IsNullOrEmpty(context.Request["var1"]))
                        SaveData(context.Request["var1"]);
                    callback = context.Request["callback"];


                    var oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();                    
                    string sJSON = oSerializer.Serialize(JSON);

                    HttpContext.Current.Response.ContentType = "application/json";
                    string qs = HttpContext.Current.Request.QueryString["callback"];

HttpContext.Current.Response.Write(callback+"(\"Clients : \"" + sJSON+ ")");


                }

            }
            catch (Exception exc)
            {

                context.Response.Write(callback +
            "({ \"return\": \"" + exc.Message + "\" })");
            }
        }

JQUERY

$.ajax({
                url:        "URL",
                dataType:   "jsonp",
                success:    function(data){
                    alert(data); // Always Undefined


                }
            });

1 个答案:

答案 0 :(得分:1)

您将在此处返回损坏的JSON:

HttpContext.Current.Response.Write(callback+"(\"Clients : \"" + sJSON+ ")");

您是否注意到\"之后的Clients:?你应该把它放在:之前。所以你的JSON看起来像这样(如果你使用了一个javascript调试工具,比如FireBug,你会立即注意到,因为FireBug会把这个错误写入你的控制台):

callback("Clients : "[{"ID":1,"Name":"client 1"},{"ID":2,"Name":"client 2"},{"ID":3,"Name":"client 3"}])

看到问题?

从不硬编码JSON。 从不使用字符串连接来构建JSON。 <强>从不

始终在构建或解析JSON时使用JSON序列化程序。

就像那样:

string sJSON = oSerializer.Serialize(new { Clients = JSON });
context.Response.ContentType = "application/json";
context.Response.Write(string.Format("{0}({1})", callback, sJSON));

在这个例子中,我将一个匿名类型new { Clients = JSON }传递给JSON序列化程序,它将产生正确有效的输出:

callback("Clients":[{"ID":1,"Name":"client 1"},{"ID":2,"Name":"client 2"},{"ID":3,"Name":"client 3"}])