2013-03-11 225 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="*"/>