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-запроса одновременно.

Другие вопросы по тегам