Jak ustawić limit czasu żądania dla jednej akcji kontrolera w aplikacji asp.net mvc

94

Chcę zwiększyć limit czasu żądania dla określonej akcji kontrolera w mojej aplikacji. Wiem, że mogę to zrobić w pliku web.config dla całej aplikacji, ale wolałbym to zmienić tylko w tej jednej akcji.

Przykład Web.config:

<system.web>
  <httpRuntime executionTimeout="1000" /> 
</system.web>

Jak mam to zrobić?

Kyle West
źródło
możliwy duplikat ASP.NET MVC i httpRuntime ExecutionTimeout
balexandre

Odpowiedzi:

130

Możesz ustawić to programowo w kontrolerze: -

HttpContext.Current.Server.ScriptTimeout = 300;

Ustawia limit czasu na 5 minut zamiast domyślnych 110 sekund (co za nieparzyste domyślne?)

AnthonyWJones
źródło
31
Wraz z pojawieniem się AsyncController warto pamiętać, że aby uzyskać podobny efekt dla żądań asynchronicznych, należy użyć właściwości [AsyncTimeout].
Jason
6
Moje pytanie z tą odpowiedzią brzmi: jak naprawdę wpłynie to tylko na jedno działanie, w którym została umieszczona? Czy po wykonaniu żądania to ustawienie zostanie przywrócone dla wszystkich przyszłych żądań?
jhilden
10
@jhilden HttpContext jest tworzony na podstawie każdego żądania, więc w następnym żądaniu zostanie przywrócona wartość domyślna
tobiak777
6
Możesz dodać HttpContext.Current (brakuje 'Current')
bboyle1234
5
Otrzymuję: „httpcontext nie zawiera definicji bieżącego”. Używam .NET Core 2.0. Jakiś pomysł jak to naprawić?
Tadej
71
<location path="ControllerName/ActionName">
    <system.web>
        <httpRuntime executionTimeout="1000"/>
    </system.web>
</location>

Chyba lepiej ustawić takie wartości w web.config niż w kontrolerze. Zakodowanie konfigurowalnych opcji jest uważane za szkodliwe.

Wojtek Trelak
źródło
15
-1 Twarde kodowanie jest dopuszczalne w szczególnych okolicznościach, jak opisano w PO. Wygląda na to, że określona akcja wymaga innego limitu czasu niż reszta czynności, więc trudne zakodowanie wewnątrz akcji brzmi jak dobre miejsce.
Levitikon
6
ExecutionTimeout nie działa dla MVC - to jest zła odpowiedź. patrz tutaj: forums.asp.net/p/1715081/ ...
jfren484
3
należy pamiętać, że jest to ignorowane i ukończone, jeśli tryb debugowania jest ustawiony na msdn.microsoft.com/en-us/library/vstudio/… ExecutionTimeout Opcjonalny atrybut Int32. Określa maksymalną liczbę sekund, przez które żądanie może zostać wykonane, zanim zostanie automatycznie wyłączone przez ASP.NET. Ten limit czasu ma zastosowanie tylko wtedy, gdy atrybut debugowania w elemencie kompilacji ma wartość False. Dlatego jeśli atrybut debugowania ma wartość True, nie trzeba ustawiać tego atrybutu na dużą wartość, aby uniknąć zamykania aplikacji podczas debugowania.
Nick van Esch
4
To nie jest najbardziej poprawna odpowiedź, ponieważ ma to efekt uboczny polegający na zmianie limitu czasu wykonywania również dla wszystkich innych akcji kontrolera.
Eric J.
1
@EricJ. tylko w obrębie trasy (tras) kontrolera, która zaczyna się odControllerName\ActionName
GoldBishop
20

Musiałem dodać „Current” za pomocą .NET 4.5:

HttpContext.Current.Server.ScriptTimeout = 300;
Patrick Michalina
źródło