跨域AJAX呼叫?

时间:2013-03-11 11:12:38

标签: javascript cross-domain jsonp

$.ajax({

      url: 'https://XXXXX.desktop.XXXX.com:9011/iws-merchant/XXXXX.htm',
      dataType: "jsonp",
      success: function (response) {
       str=response;

      },
      error: function( response ) {
          alert( "ERROR:  " + JSON.stringify );
       }
   });

它总是在错误块中。我正在对另一个PORT(相同域)进行AJAX调用。

但是当我尝试在新标签中点击相同的网址时。我能看到回应。

任何帮助都将得到很高的评价。

2 个答案:

答案 0 :(得分:3)

您可以使用JSONP作为Gaurav Agrawal建议您也可以为接收ajax请求的网站启用Access-Control-Allow-Origin。

Ajax的工作原理如下: 相同的域但不同的端口=不同的域

如果您在ajax目标服务器上使用asp.net,则可以在web.config中启用访问控制添加:

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>
<system.webServer>

并帮自己一个忙,并将“*”替换为您的网站网址!

在某些情况下,你甚至可以使用这些键,只需谷歌每个功能添加它之前!

<add name="Access-Control-Allow-Headers" value="*" />
<add name="Access-Control-Allow-Methods" value="*" />
<add name="Access-Control-Allow-Credentials" value="true" />
<add name="Access-Control-Expose-Headers" value="*"/>

答案 1 :(得分:2)

您无法使用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);
});