кросс-домен jsonp работает только в IE - PullRequest
1 голос
/ 28 апреля 2010

РЕДАКТИРОВАТЬ : Сначала я думал, что это не работает междоменный вообще, теперь я понимаю, что это работает только в 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);
    }
}

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

Рад, что сейчас работает.

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

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

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

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

Приветствия

Мэтт

0 голосов
/ 28 апреля 2010

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

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

...