jsonp пересекают домен, только работающий в IE

Править: Сначала я думал, что это не работало перекрестный домен вообще, теперь я понимаю, что это только работает в IE

Я использую jQuery для вызова веб-сервиса (ASP.NET .axmx), и попытка нам jsonp так, чтобы я мог назвать его через различные сайты. Прямо сейчас это работает ТОЛЬКО в IE, но не в Firefox, Chrome, Safari. Кроме того, в IE диалоговое окно открывается, предупреждая, что "Эта страница получает доступ к информации, которая не находится под ее контролем..." Какие-либо идеи?

Вот код:

$.ajax({
    type: "POST",
    url: "http://test/TestService.asmx/HelloWorld?jsonp=?",
    dataType: "jsonp",
    success: function(data) {
        alert(data.prop1);
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert(XMLHttpRequest.status + " " + textStatus + " " + errorThrown);
    }
}); 

И серверный код:

[ScriptService]
public class TestService : System.Web.Services.WebService{
    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void HelloWorld() {
        string jsoncallback = HttpContext.Current.Request["jsonp"];
        var response = string.Format("{0}({1});", jsoncallback, @"{'prop1' : '" + DateTime.Now.ToString() + "'}");
        HttpContext.Current.Response.Write(response);
    }
}
1
задан iboeno 28 April 2010 в 21:06
поделиться

2 ответа

Рад, что теперь он работает.

Вы пытаетесь отправить параметр "jsonp", который необходимо передать для "дополнения" json, в качестве параметра GET, то есть в строке URL-адреса. Что делать правильно.

Но поскольку вы указали POST, этого не происходит. Фактически, поскольку вы указываете POST, сервер ожидает, что все параметры будут в данных POSTed, а не в переменных GET, поэтому он не проверяет URL-адрес для получения параметра.

Я думаю, что вполне возможно, что jQuery довольно снисходительно относится к тому, как он выполняет оценку JSON, и, следовательно, все еще работает в IE, потому что (а) если сервер не читает переменную "jsonp", я думаю, что это отправлю обратно "({'prop1': ''})" , который по-прежнему может быть оценен как JSON, и (b) IE не имеет таких же ограничений на кросс -сайтовый скриптинг (политика «того же происхождения»), что и в других браузерах. Но мне нужно отладить его, чтобы быть уверенным.

Я бы посоветовал использовать FireBug в Firefox для отладки того, что происходит с такого рода запросами в будущем, но главный вывод заключается в том, что если вы отправляете параметры как часть URL-адреса, используйте GET, а не POST. .

Ура,

Мэтт

2
ответ дан 3 September 2019 в 00:57
поделиться

Если вы не укажете параметр jsonp и / или jsonpCallback , jQuery автоматически сгенерирует имя функции и добавит параметр запроса, например callback = jsonp1272468155143 . Это означает, что ваше приложение должно выводить данные с использованием этого имени функции.

Вы всегда можете установить jsonpCallback на test , и в этом случае ваш пример будет работать.

0
ответ дан 3 September 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: