【问题标题】:Cross domain JSON calls [duplicate]跨域 JSON 调用 [重复]
【发布时间】:2012-09-16 13:25:21
【问题描述】:

可能重复:
Ajax cross domain call

我有返回 JSON 响应的 Asp.Net 控制器方法。但是我无法使用 Jquery 的$.getJSON(...){}从不同的域调用它

快速谷歌搜索建议必须使用 JSONP。问题是 JSON 和 JSONP 有什么区别?这只是另一个新名词吗?如果 JSONP 工作正常,为什么我不能让 JSON 工作?有什么办法不使用这些花哨的 JSONP 并使用普通的旧 JSON,因为我害怕对我的服务器端代码进行任何更改。

【问题讨论】:

  • 这个有帮助吗en.wikipedia.org/wiki/JSONP
  • 常规的 JSON ajax 将不起作用,因为它违反了同源策略,该策略通常在所有现代浏览器中都存在。此策略不允许使用 javascript 向另一个域发出请求,因为会出现许多安全问题,特别是浏览器存储的 cookie 和会话。如果您有兴趣,请阅读维基百科的更多信息。
  • 您可能想研究跨域资源共享 (CORS)。

标签: jquery asp.net json asp.net-mvc-3 jsonp


【解决方案1】:
JSONP = JSON + PADDING 
      = additional JavaScript callback function wrapping the JSON content.

在 JavaScript 中,所有 ajax 请求都遵循这个跨域策略标准。 这可以防止 XMLHttpRequest 对象请求不同域上的资源。

由于 JSON 是有效的 JavaScript,我们不能使用它。 JSONP 是作为一种从某个远程域检索数据的方法而创建的 通过编写回调函数并动态添加脚本标签到 DOM, 脚本标签将在加载时调用回调,然后数据可供应用程序使用。

要向启用 JSONP 的服务器发出请求,我们需要发送一些关于我们网站的信息,以便服务器可以创建我们可以使用的响应。

【讨论】:

    【解决方案2】:

    您不能使 jsonp 在所有跨域站点上工作,除了允许您使用额外回调(值或名称)告诉您提供有关您的服务器的一些信息的站点。

    如果其他网站不允许您提供的回电,您将一无所获。

    【讨论】:

      【解决方案3】:

      您不能使用 JSON 进行跨域 AJAX 调用。您需要使用JSONP。因此,不要从控制器操作中返回常规的JsonResult,而是编写一个自定义操作结果,它将 JSON 包装在作为参数传递的回调中:

      public class JsonpResult : ActionResult
      {
          private readonly object _obj;
      
          public JsonpResult(object obj)
          {
              _obj = obj;
          }
      
          public override void ExecuteResult(ControllerContext context)
          {
              var serializer = new JavaScriptSerializer();
              var callbackname = context.HttpContext.Request["callback"];
              var jsonp = string.Format("{0}({1})", callbackname, serializer.Serialize(_obj));
              var response = context.HttpContext.Response;
              response.ContentType = "application/json";
              response.Write(jsonp);
          }
      }
      

      然后让您的控制器操作返回此自定义操作结果:

      public ActionResult SomeAction()
      {
          var result = new[]
          {
              new { Id = 1, Name = "item 1" },
              new { Id = 2, Name = "item 2" },
              new { Id = 3, Name = "item 3" },
          };
          return new JsonpResult(balances);
      }
      

      现在您可以跨域使用此操作:

      var url = "http://example.com/SomeController/SomeAction/";
      $.getJSON(url + '?callback=?', function (data) {
          alert(data);
      });
      

      【讨论】:

        猜你喜欢
        • 2013-12-07
        • 2012-10-31
        • 1970-01-01
        • 2012-04-14
        • 2014-08-23
        • 2013-07-11
        • 2013-12-27
        • 2011-07-29
        • 2013-04-26
        相关资源
        最近更新 更多