Ajax через Jquery и ASP.NET - PullRequest
       7

Ajax через Jquery и ASP.NET

2 голосов
/ 18 октября 2011

Резюме

context.Response.Header.Add("Content-Type", "application/json");

игнорируется, пока

context.Response.ContentType = "application/json";

прерывает вызовы jQuery ajax.

=============================================== =====================

У меня есть IHttpHandler, который возвращает некоторые данные JSON и определяется как:

void ProcessRequest(HttpContext context)
{
    context.Response.Write(/* some JSON */);
}

и вызывается с использованием методов jQuery Ajax следующим образом:

$.get(SOME_URL, SUCCESS);

Это отлично работает.

Однако, если метод ProcessRequest определен следующим образом:

void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "application/json"
    context.Response.Write(/* some JSON */);
}

происходит сбой, это означает, что функция SUCCESS в $.get(SOME_URL, SUCCESS); никогда не срабатывает, однако правильное содержимое все равно возвращается с ожидаемыми заголовками согласно Fiddler2.

С другой стороны, если метод ProcessRequest определен так:

void ProcessRequest(HttpContext context)
{
    context.Response.Header.Add("Content-Type", "application/json");
    context.Response.Write(/* some JSON */);
}

все работает, но Fiddler2 сообщает, что он возвращается как тип "text / html".

Есть идеи, почему это происходит?

ПРИМЕЧАНИЕ. URL-адрес не имеет расширения и приложение работает на IIS 7.5, поэтому мне интересно, связана ли проблема с типами IIS MIME.

1 Ответ

1 голос
/ 25 октября 2011

IHttpHandler - отличный выбор для реализации обработчиков AJAX в ASP.net.Он имеет меньшие накладные расходы, чем страница, и его легко установить / установить по сравнению с чем-то вроде веб-служб WCF.Хотя вы можете создать классический веб-сервис .asmx, это не должно влиять на проблему, которую вы опубликовали.

Также context.Response.ContentType = "application / json";это правильный метод для изменения заголовка contenttype HttpResponse из метода ProcessRequest вашего обработчика.

Вероятно, ваша проблема будет неверно сформированным ответом.Вопрос в том, чтобы сузить ответ.

  1. Если вы еще этого не сделали, получите полную копию ответа сервера, используя firebug, инструменты разработчика chrome, fiddler или wireshark.Используя правильную технику для изменения типа контента, выделенного выше, вы говорите, что событие успеха ajax никогда не запускается, но вы не дали нам знать, проверили ли вы HttpResponse для заголовка типа контента, кода ответа и действительного json.
  2. Убедитесь, что заголовок типа контента на самом деле установлен на "application / json".
  3. Дважды проверьте, что ваш json на самом деле синтаксически корректен при отправке по проводам.(Помните, что это должно быть «пригодным для оценки» с помощью JavaScript
    • неправильно поставленная скобка, кавычка или двоеточие).
  4. У вас есть какие-нибудь управляющие символыили Unicode текст в вашем JSON?Они правильно сбежали?Это распространенная ошибка в json, неправильно экранированный контент или неправильная кодировка.Используете ли вы какой-либо код для преобразования байтов в строки или строки в байты в вашем коде?Если это так, убедитесь, что вы используете нужную кодировку, вероятно, utf-8.

Если вы подозреваете, что выбранный вами метод UrlRewriter меняет заголовки ответа, я надеюсь, что это относительно легко отключить.и протестировать с расширением на основе URL вашего обработчика?Это, по крайней мере, подтвердит, что вы диагностируете правильную проблему и что стоит потратить время на дальнейшее исследование проблемы.Если вы подтвердите, что проблема связана с UrlRewriter, вам следует опубликовать вопрос о конкретной технологии UrlRewriter, которую вы используете.Например, вы используете что-то вроде ISAPI Reqwrite от Helicon Tech?Или новый перезаписывающий URL от Microsoft?Ваше собственное фирменное решение?

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