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

Это всегда происходит в блоке с ошибкой. Я делаю вызов AJAX для другого PORT (Same Domain).Перекрестный домен AJAX Call?

Но когда я пытаюсь попасть на тот же URL-адрес на новой вкладке. Я могу видеть ответ.

Любая помощь будет очень полезна.

+0

* домен *, * протокол * и * порт * приходится соответствовать. В противном случае запрос будет подпадать под ограничения * SOP *. – jAndy

+0

Правильно ли настроен сервер, чтобы вернуть ответ JSONP? В вашем примере, поскольку вы не указали параметр обратного вызова, параметр GET, отправленный на сервер, будет называться «обратный вызов». –

+0

, поэтому мы можем использовать JSONP ryt? – Apurv

ответ

2

Вы не можете совершать перекрестные вызовы AJAX через JSON. Вам нужно использовать 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 как предложено Gaurav Агроэл ИЛИ вы можете включить Access-Con trol-Allow-Origin для сайта, который получает запрос ajax.

Ajax работает следующим образом: тот же домена, но другой порт = отличается домен

, если вы используете asp.net на вашем АЯКС целевого сервера вы можете включить контроль доступа, добавив это в web.config:

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

и сделайте себе одолжение и замените «*» на ваш сайт url!

В некоторых ситуациях вам могут понадобиться даже эти ключи, только каждая функция Google перед добавлением!

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