Ресурс интерпретируется как скрипт, но передается с приложением типа MIME / json & parsererror - PullRequest
1 голос
/ 10 февраля 2011

Хорошо, у меня есть вызов JQuery AJAX в файле .html, который находится на моем рабочем столе. Он выполняет вызов службы WCF, расположенной на веб-сервере в эфире.

Хорошая новость в том, что это работает. Сорта .. почти .. но не полностью.

Будет выполнен вызов AJAX, а Fiddler покажет ответ JSON от веб-службы. К сожалению, до браузера не доходит. callback=? есть, поэтому я не получаю ошибку межсайтового скриптинга. (Access-Control бла-бла-бла)

Если я сделаю это с открытыми инструментами разработки Chrome, появится следующее сообщение:

Resource interpreted as script but transferred with MIME type application/json

Успех: обратный вызов не вызывается, а ошибка: обратный вызов возвращает одно слово в statusText: parsererror

Я весь день бился об это.

function AJAXGet() {
    $.ajax({
        url: "http://xxxx/yyyyService/yyyyService.svc/GetZZZ?callback=?",
        dataType: 'json',
        data: JSON.stringify('{"customerID": "1"}'),
        contentType: "application/json; charset=utf-8; application/x-javascript",
        success: function (data) {
            alert(data);
        },
        complete: function (data) {
            alert(data);
        },
        error: function (xhr) {
            alert("AJAXGetError: " + xhr.statusText);
        }
    });
}

Фиддлер говорит, что это было отправлено: GET /yyyyService/yyyyService.svc/GetZZZ?callback=jQuery150833801421286173_1297309350515&%22{\%22yyyyID\%22:%20\%221\%22}%22&_=1297309350540 HTTP/1.

Вот WCF:

[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
List<Note> GetNotes(string yyyyID)

1 Ответ

4 голосов
/ 10 февраля 2011

Вы используете JSONP - ваш код на стороне сервера должен его поддерживать.В этом случае ваша служба WCF должна возвращать скрипт-let, например [callback name]([json string]), где [имя обратного вызова] будет сгенерированной jquery функцией js (то, что вы видите как значение обратного вызова в запросе fiddler) и [строка json] будет ваши обычные данные JSON из службы.Так что проверь ответ в фиддлере.Если ваша служба не возвращает ответ JSONP, вам нужно добавить эту поддержку в конце службы.

Проверьте эту статью , чтобы узнать, как это сделать в .NET 4 (которая поддерживает JSONP),Для .NET 3.5 его работа больше - см. эту статью MSDN для расширения WCF для поддержки JSONP.Еще одним быстрым хаком (для .NET 3.5) может быть создание HttpModule, который будет наблюдать запрос JSON и изменять ответ, если URL-адрес запроса имеет callback параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...