mam standardowe działania non-asynchroniczny jak:Uruchamianie i Zapominając zadanie Async w MVC Akcja
[HttpPost]
public JsonResult StartGeneratePdf(int id)
{
PdfGenerator.Current.GenerateAsync(id);
return Json(null);
}
Pomysł jest, że wiem, że to pokolenie PDF może trwać bardzo długo, więc po prostu rozpocząć zadanie i powrót, nie dbając o wynik operacji asynchronicznej.
W domyślnie ASP.Net MVC 4 Aplikacja ta daje mi ten miły wyjątek:
System.InvalidOperationException: asynchroniczny operacja nie może być uruchomiona w tym czasie. Operacje asynchroniczne można uruchamiać tylko w asynchronicznym programie obsługi lub module lub podczas określonych zdarzeń w cyklu życia strony. Jeśli wystąpił ten wyjątek podczas wykonywania strony, upewnij się, że strona jest oznaczona <% @ Page Async = "true"%>.
Co jest wszelkiego rodzaju nieistotne dla mojego scenariusza. Patrząc na nią można ustawić flagę na false, aby zapobiec tego wyjątek:
<appSettings>
<!-- Allows throwaway async operations from MVC Controller actions -->
<add key="aspnet:AllowAsyncDuringSyncStages" value="true" />
</appSettings>
https://stackoverflow.com/a/15230973/176877
http://msdn.microsoft.com/en-us/library/hh975440.aspx
Ale pytanie brzmi, czy istnieje jakaś krzywda przez akurat tę operację Async i zapominając o tym od synchroniczne działanie kontrolera MVC? Wszystko, co mogę znaleźć, zaleca ustawienie kontrolera Async, ale to nie jest to, czego szukam - nie byłoby sensu, ponieważ powinien natychmiast powracać.
Ponieważ jest to naprawdę ostrzeżenie, to niefortunne, że nie można go przedstawić w ten sposób (na przykład jako ostrzeżenie dla konsoli wyjściowej w trybie debugowania). –
Powiązana dokumentacja również nie jest bardzo bezpieczna - określają ją jako: "wykrywa aplikację niewłaściwie wykorzystującą interfejs API asynchronicznego". Być może ten wyjątek musi być oddzielony od bardziej podstępnego niebezpieczeństwa ", nadal jest niezrównana praca asynchroniczna, gdy kończy się asynchroniczny moduł lub kończy się sygnalizacja obsługi." –
tak, to bardzo niefortunne, że nie ma jakiegoś atrybutu lub innego mechanizmu sygnalizującego, że w twoim przypadku jest to zamierzone (i całkowicie poprawne) zachowanie - ale jak nieobsłużone wyjątki zadań powodujące awarię aplikacji we wcześniejszej wersji (lepiej bezpieczniej niż przepraszam), być może następny rozwiąże ten wymóg również ... –