2016-01-06 10 views

Odpowiedz

3

Najlepszym sposobem znalazłem tak daleko, aby obsłużyć długi skrypt uruchomiony (jeśli aplikacja po prostu nie można uniknąć jeden) jest przede wszystkim stworzenie obsługi asynchronicznej:

public async Task<IActionResult> About() 
    { 
      var cts = new CancellationTokenSource();    
      cts.CancelAfter(180000); 
      await Task.Delay(150000, cts.Token); 
     return View(); 
    } 

W powyższym fragmencie I dodałem token anulowania, aby powiedzieć, że moja metoda asynchroniczna powinna zostać anulowana po 180 sekundach (mimo że w tym przykładzie nigdy nie zwleka dłużej niż 150 sekund) dodałem limit czasu, aby upewnić się, że istnieje ograniczenie dotyczące tego, jak długo mój skrypt może biegać.

Jeśli uruchomisz ten program, otrzymasz błąd HTTP 502.3, ponieważ ustawiono limit czasu na httpPlatform z 00:02:00.

Aby wydłużyć ten limit czasu, przejdź do pliku web.config wewnątrz folderu wwwroot i dodaj właściwość requestTimeout = "00:05:00" do elementu httpPlatform. Na przykład:

<httpPlatform requestTimeout="00:05:00" processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/> 

Długotrwały skrypt powinien teraz działać.

Oznacza to jednak, że każde żądanie potrwa 5 minut, aby upłynąć limit czasu, więc będziesz musiał upewnić się, że używasz sztuczki CancellationToken w celu ograniczenia żądań asynchronicznych, które masz w swojej aplikacji. W poprzednich wersjach MVC mieliśmy atrybut AsyncTimeOut, który można dodać do kontrolera, ale wygląda na to, że został on przecięty w MVC6 See GitHub aspnet/mvc Issue #2044

+0

Dziękuję za bardzo interesującą odpowiedź, ale jest to niedopuszczalne dla mojego problemu: "Oznacza to jednak, że każde żądanie może upłynąć 5 minut ..." Potrzebuję tylko programowego rozwiązania bez interwencji web.config. –

+1

O ile mi wiadomo, nie ma programowego sposobu, aby to zrobić ze względu na sposób, w jaki IIS jest proxy dla DNX. Jeśli nie edytujesz tej wartości, żądanie zawsze będzie zawsze 502 po 2 minutach –

+0

@MartinBeeby Dodanie tej linii powoduje teraz awarię aplikacji podczas uruchamiania, domyślnie nie ma tam domyślnego węzła '' –

Powiązane problemy