Sunil Kumar Pandab Ответов: 3

Время ответа на запрос out in Asp.net


У меня есть некоторая массовая работа на сервере, когда я просто нажимаю кнопку в gridview, которая снова находится внутри панели обновления(асинхронный пост назад). Моя основная работа заключается в том, чтобы сделать вызов API, сохранить полученный файл, прочитать этот файл и показать его в gridview. Моя проблема-не массовая работа. Но основная работа занимает много времени, чтобы закончить, и моя страница запроса не ждет завершения. Так что я не получаю никакого результата из-за тайм-аута.

Как ее решить? Как дождаться окончания всей работы моей страницы на сервере?

Мне нужна немедленная помощь, потому что я потратил впустую много времени, а также перепробовал много вещей.

3 Ответов

Рейтинг:
7

Sunil Kumar Pandab

Я сам ее разгадал...

Я только что добавил AsyncPostBackTimeout="3600" в свойство ScriptManager, и оно работает. Код приведен ниже :-

<asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="3600">
    </asp:ScriptManager>



Он прекрасно работает на моей локальной машине, а также на серверной машине, где размещен мой проект.

Но после хостинга он не работает на компьютере пользователя, который использует мой проект, нажав на URL-адрес моего проекта. Есть ли какие-либо настройки IIS, которые я должен сделать для тайм-аута панели обновления AsyncPostBack?

Мне нужна немедленная помощь...
Заранее спасибо...


Рейтинг:
2

Christiaan Rakowski

Использование параметра executionTimeout в файле web.config может помочь решить прямую проблему, но если вам нужно подождать больше минуты, возможно, стоит просто убить его. ASP.NET разделите и позвольте "нормальному" C# взять верх, таким образом пользователь сможет взаимодействовать с другими частями вашего приложения.

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

Чтобы пользователь мог видеть обновленные данные, вам придется реализовать на странице какой-то механизм обновления.
Чтобы сделать это, вы можете позволить потоку установить флаг в вашем коде, когда это будет сделано.
Используйте AJAX-вызовы с определенным интервалом для опроса HttpHandler, который передаст статус флага.
Если флаг установлен в done, обновите содержимое панели/GridView или просто перезагрузите всю страницу (если это возможно).

Надеюсь, это вам помогло.


Sunil Kumar Pandab

Не могли бы вы дать мне небольшой пример кода для правильного получения вашего решения?

Christiaan Rakowski

Добавьте новый простой HTTPHandler в свой проект и заполните его кодом примерно так.

использование системы.Сеть;
использование системы.Нарезание резьбы;

общественный класс WorkHandler : IHttpHandler
{
public bool IsReusable
{
get {return true;}
}

public void ProcessRequest(HttpContext context)
{
Thread thread = new Thread(new ThreadStart(WorkThreadFunction));
нить.Начать();
контексте.Ответ.Write("поток запущен");
}

общественного недействительными WorkThreadFunction()
{
пробовать
{
// Вызов методов для выполнения фоновой работы
}
поймать (исключение бывший)
{
// ошибки журнала
}
}
}

Sunil Kumar Pandab

Тогда как же я могу вызвать его из своего кода позади?

Christiaan Rakowski

HTTPHandler - это что - то вроде урезанной страницы ASPX. Чтобы вызвать этот код, вам нужно сделать AJAX-вызов обработчика. Поэтому, если обработчик называется WorkerHandler.ashx, вы можете использовать для этого onclientclick кнопки: onclientclick="$.get(' WorkerHandler.ashx' ); return false;"

Sunil Kumar Pandab

У меня есть сложный код. Моя кнопка link находится между gridview. Gridview снова внутри панели обновления. После выполнения объемной задачи он открывает всплывающую панель с другим gridview. Если я пройду через ваше предложение, то мне придется полностью изменить свой код. Вы на 100 процентов уверены, что ваше предложение сработает для меня(моя страница будет ждать окончания работы сервера). Вы пробовали это раньше в своем коде? Я уже пробовал обработчик для загрузки изображений в других проектах, но здесь сценарий другой.

Christiaan Rakowski

Я использую этот способ работы довольно часто для массовой фоновой обработки, но никогда с реальным сценарием "занятого ожидания", как у вас сейчас. Поэтому я не могу быть на 100% уверен, что это сработает для вас, и если ваш код довольно сложен, то полное переписывание/организация может занять очень много времени. Однако это единственная известная мне система, которая может помочь в этом сценарии (кроме переменной времени ожидания запроса в файле web.config). Я вижу выше, что вы уже пробовали это, и мне кажется странным, что он все еще будет тайм-аут так быстро. Помимо моего решения здесь, еще одна вещь может заключаться в том, чтобы просто оптимизировать часть массовой обработки.

Рейтинг:
1

Sandip.Nascar

Вы можете использовать executiontimeout в web.config

<system.web>
    <httpruntime>
      executionTimeout="3600"
      maxUrlLength="10000" 
      maxQueryStringLength="80000" />



</httpruntime></system.web>


Это решит вашу проблему.

овации


Sunil Kumar Pandab

Я уже проверил этот вариант. не работать...

Sandip.Nascar

Можете ли вы проверить увеличение значения executiontimeout? Это работает на меня.

Sunil Kumar Pandab

executionTimeout="3600" означает, что он будет работать в течение 1 часа, но после использования этого кода тайм-аут происходит через 1 минуту или 1 с половиной минуты. Так что нет необходимости увеличивать это значение. Я также проверил, увеличив это значение. Все еще не работает...

Sandip.Nascar

Это означает, что между ними происходит какое-то исключение. Попробуйте зарегистрировать исключение и посмотреть, что произойдет.

Sunil Kumar Pandab

никаких исключений не бывает, я тоже проверил...