ASP.Net: IHttpAsyncHandler и IRequiresSessionState не работают
Я реализовал IHttpAsyncHandler. Я делаю около 5 различных вызовов AJAX с веб-страницы с виджетами для этого обработчика.
Один из этих виджетов загружается за 15 секунд (из-за большого запроса к базе данных), остальные должны загрузиться менее чем за секунду. Обработчик отвечает синхронно.
Я получаю очень противоречивые результаты. Метод ProcessRequest использует Session и другие переменные уровня класса. Может ли это быть причиной того, что разные запросы используют один и тот же поток вместо каждого собственного?
Я получаю это...
Запрос1 ---> Ответ 1 сек
Request2 ---> ответ 14 сек
Request3 ---> ответ 14,5 сек
Request4 ---> ответ 15 сек
Request5 ---> ответ 15,5 сек
но я ищу что-то еще, как это...
Запрос1 ---> Ответ 1 сек
Request2 ---> ответ 14 сек
Request3 ---> ответ 1,5 сек
Request4 ---> ответ 2 сек
Request5 ---> ответ 1,5 сек
Без публикации слишком большого количества кода моя реализация методов IHttpAsyncHandler довольно стандартна.
private AsyncProcessorDelegate _Delegate;
protected delegate void AsyncProcessorDelegate(HttpContext context);
IAsyncResult IHttpAsyncHandler.BeginProcessRequest(HttpContext context,
AsyncCallback cb, object extraData)
{
_Delegate = new AsyncProcessorDelegate(ProcessRequest);
return _Delegate.BeginInvoke(context, cb, extraData);
}
void IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
{
_Delegate.EndInvoke(result);
}
Помещая точку прерывания отладки в мой метод IHttpAsyncHandler.BeginProcessRequest, я вижу, что метод не запускается до тех пор, пока не завершится последний процесс.
Также мой machine.config имеет эту запись... processModel autoConfig="true" без других установленных свойств.
Я звоню обработчику вот так...
$.ajax ({тип: "GET", URL: "../HTML/HtmlHandler.ashx", кеш: true,
dataType: "text", данные: { html: name }, успех: функция (html) {
//$(function() {
//console.log(tabname);
//console.log("msg:" + msg);
$("#" + name + "holder").html(html);
//checkAllLoaded();
ClientHome_init('');
//});
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
$("#" + name + "holder").html("<span>Error retrieving widget.</span>");
//console.log("error:" + tabname);
//checkAllLoaded();
}
}
Что еще мне нужно проверить?
2 ответа
Просто, если кто-то другой имеет эту проблему, изменение IRequiresSessionState на IReadOnlySessionState устранило проблему для меня.
Ваша проблема здесь, вероятно, не с вашим кодом сервера. Природа JavaScript в том, что он синхронный. Даже когда вы используете асинхронные запросы AJAX, я обнаружил, что javascript редко позволяет вам делать два HTTP-запроса одновременно.