2013-03-11 106 views
0
$.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调用。跨域AJAX调用?

但是,当我尝试在新标签中击中相同的URL。我能够看到回应。

任何帮助将非常appreicated。

+0

* domain *,* protocol *和* port *必须匹配。否则,请求将落入* SOP *限制之下。 – jAndy 2013-03-11 11:14:43

+0

服务器设置是否正确以返回JSONP响应?在你的例子中,因为你没有指定回调参数,所以发送到服务器的GET参数将被称为'回调'。 – 2013-03-11 11:16:49

+0

所以我们可以使用JSONP ryt? – Apurv 2013-03-11 11:17:24

回答

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); 
}); 
3

可以使用JSONP作为拉夫阿格拉瓦尔建议或者可以允许访问精读trol-Allow-Origin为接收ajax请求的站点。

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="*"/>