【问题标题】:JSONP Data is undefined with cross domain postingJSONP 数据未定义跨域发布
【发布时间】:2013-01-02 02:57:32
【问题描述】:

我正在尝试将来自 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


                }
            });

【问题讨论】:

  • \"Clients : \" 位在那里做什么?
  • 这就是列表的对象类型作为它的过去转换成json。无论 \"Clients : \" 位如何,它似乎都未定义
  • 不,不是。没有“对象类型”之类的东西,据我所知,您正在生成无效的 JavaScript (foo("Clients : "{ }))。如果删除 \"Clients : \" 会发生什么?
  • 它仍然显示为未定义。当成功条件正在运行时,我收到了回复,但在 FireBug 中看不到任何数据
  • 您传递给序列化程序的JSON 变量是什么?它来自哪里,最重要的是为什么它被称为 JSON?我的意思是序列化程序的目的是传递一个对象实例并生成 JSON。我希望你没有将 JSON 字符串传递给它。

标签: jquery .net json web-services jsonp


【解决方案1】:

您在此处返回损坏的 JSON:

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

你注意到Clients: 后面的\" 了吗?你应该把它放在: 之前。所以您的 JSON 看起来像这样(如果您使用了诸如 FireBug 之类的 javascript 调试工具,您会立即注意到,因为 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"}])

【讨论】:

  • 感谢您的帮助。我确实看到了格式问题,所以谢谢。但是,我似乎仍然遇到了这个字符串 Data = oSerializer.Serialize(new { Clients = JSON }); 未定义的问题。 context.Response.ContentType = "应用程序/json"; context.Response.Write(string.Format("{0}({1})", callback, Data)); JSON 是我正在传递的列表。再次感谢
猜你喜欢
  • 2016-01-06
  • 2013-11-19
  • 2013-09-26
  • 1970-01-01
  • 2012-11-05
  • 2011-07-27
  • 2011-10-13
  • 1970-01-01
  • 2013-10-31
相关资源
最近更新 更多