ASP.Net: IHttpAsyncHandler и IRequiresSessionState не работают - PullRequest
0 голосов
/ 26 марта 2010

Я реализовал IHttpAsyncHandler. Я делаю около 5 различных вызовов AJAX с веб-страницы с виджетами для этого обработчика.

Один из этих виджетов загружается за 15 секунд (из-за большого запроса к базе данных), остальные должны загрузиться менее чем за секунду. Обработчик отвечает синхронно.

Я получаю очень противоречивые результаты. Метод ProcessRequest использует Session и другие переменные уровня класса. Может ли это быть причиной того, что разные запросы используют один и тот же поток вместо каждого собственного?

Я получаю это ...

Запрос1 ---> Ответ 1 сек
Запрос2 ---> Ответ 14 сек
Запрос3 ---> Ответ 14,5 сек
Request4 ---> ответ 15 сек
Запрос5 ---> Ответ 15,5 сек

но я ищу что-то еще подобное ...

Запрос1 ---> Ответ 1 сек
Запрос2 ---> Ответ 14 сек
Запрос3 ---> Ответ 1,5 сек
Request4 ---> ответ 2 сек
Запрос5 ---> Ответ 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", кеш: верно, dataType: "text", данные: {html: имя}, success: function (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 ]

3 голосов
/ 29 марта 2010

Просто если кто-то другой столкнулся с этой проблемой, изменение IRequiresSessionState на IReadOnlySessionState устранило проблему для меня.

0 голосов
/ 26 марта 2010

Ваша проблема здесь, вероятно, не в коде вашего сервера. Природа JavaScript в том, что он синхронный. Даже если вы используете асинхронные запросы AJAX, я обнаружил, что javascript редко позволяет вам делать два HTTP-запроса одновременно.

...