2010-03-26 3 views
0

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

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

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

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

Request1 ---> ответ 1 сек
Request2 ---> ответ 14 сек
Request3 ---> ответ 14,5 сек
Request4 - -> ответ 15 сек
Request5 ---> ответ 15,5 сек

, но я искал что-то более, как это ...

Request1 ---> Ответ 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", кэш: правда, dataType: "text", data: {html: name}, 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(); 
    } 
} 

Что еще мне нужно проверить?

ответ

3

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

-1

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

+1

Это неправда. – ctrlShiftBryan