Почему к тому же доменному ajax-запросу добавляется параметр обратного вызова jsonp? - PullRequest
3 голосов
/ 25 февраля 2011

Хорошо, это должен быть довольно простой вопрос, и я, вероятно, упускаю что-то очевидное. У меня есть простой скрипт, делающий запрос к серверу:

var DTO = { 'path': path };
var url = 'default.aspx/Get'; 

 var test;
$('#getInstance').click(function () {
            $.ajax({
                url: url,
                type: 'POST',
                dataType: 'json',
                data: JSON.stringify(DTO),
                contentType: 'application/json; charset=utf-8',
                success: function (msg) {                    
                    test = msg;
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    alert(textStatus);
                    alert(errorThrown);
                }
            });

        });

Это отлично работает, так как подключается к серверу и возвращает данные, с одной простой проблемой. Он обрабатывает этот запрос как междоменный запрос, поэтому использует jsonp. Код сервера находится здесь:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static MyObject Get(string path)
    {
        MyObject foo = new MyObject();

        return foo;
    }

Обычно это не было бы проблемой, за исключением того, что я обращаюсь к WebMethod, и у него нет возможности возвращать ответ jsonp (это означает, что он не может прикрепить функцию обратного вызова к ответу. Теперь, если это было ручной ответ, я мог бы взломать его и прикрепить параметр, но я пользуюсь встроенной сериализацией, поэтому нет способа возиться с ответом.

Чтобы помочь уточнить. Страница размещена по адресу:

http://127.0.0.1:144/default.aspx

и запрос в firebug:

http://127.0.0.1:144/default.aspx/Get?callback=jQuery1502768168154247801_1298656485388

Позвольте мне подчеркнуть тот факт, что этот код работает. Единственная проблема заключается в том, что jQuery рассматривает этот запрос как междоменный. Но почему?

ОБНОВЛЕНИЕ: Ну, после еще многих часов и большего количества испытаний я сузил эту проблему до того, чтобы она была ошибкой в ​​jquery 1.5.1. Я провел некоторое тестирование со старыми версиями (все версии 1.4), и у меня не было проблем, запрос был сделан с использованием JSON, и ответ был получен успешно. Что они могли сделать, чтобы этот запрос считался CORS?

Ответы [ 2 ]

9 голосов
/ 26 февраля 2011

После еще одного исследования, наконец, определили эту проблему.Как указано в моем последнем обновлении, проблема была связана с использованием версии jQuery 1.5.Когда у меня закончились идеи, я попробовал предыдущую версию jQuery, и что бы вы знали, она работала как ожидалось.

Когда я готовился подать отчет об ошибке, я искал в базе данных ошибок и нашелнесколько отчетов об ошибках, соответствующих одному и тому же поведению.Оказалось, что это ошибка в плагине проверки jQuery, влияющая на новую версию jQuery.

Я разместил запись в блоге с объяснением

0 голосов
/ 25 февраля 2011

Попробуйте явно установить crossDomain в false в вашем вызове $ .ajax ():

$.ajax({
  crossDomain: false,
  // The rest of your options here.
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...