Wie man eine Seite nur einmal in asp.net mvc zeigt

9

In meiner App überprüfe ich, ob eine Konfigurationsdatei verfügbar ist oder nicht. Wenn es nicht so ist, möchte ich zur Installationsseite umleiten.

Für mich ist der beste Ort, um dies zu erreichen, application_start . Weil es nur einmal passiert. Wenn ich in application_start einchecke und Response.Redirect schreibe, bekomme ich Response is not available in this context .

Ich habe versucht andere Antworten im Stack-Überlauf umzuleiten in application_start like HttpContext.Current.Response.Redirect ; für mich hat keiner gearbeitet.

Ich möchte das nicht in base controller oder in filter machen, weil die Prüflogik für jede einzelne Anfrage auftritt.

Mein Ziel ist es, es nur einmal zu überprüfen und es ist am besten, wenn die App startet.

Update 1

Ich habe response.redirect zu application_start hinzugefügt, habe aber folgenden Fehler:

Anwendungsstart:

%Vor%

aber ich erhalte einen Fehler wie folgt:

  

Antwort ist in diesem Kontext nicht verfügbar.

     

Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es aus dem Code stammt.

     

Ausnahmedetails: System.Web.HttpException: Antwort ist in diesem Kontext nicht verfügbar.

    
Mo Hrad A 08.08.2016, 13:56
quelle

3 Antworten

3

Wenn Sie wirklich vermeiden wollen, dass nach der Einrichtung für jede Anfrage ein Filter ausgeführt wird, können Sie Folgendes tun:

RedirectAttribute.cs (generisches Beispiel)

%Vor%

In Global.asax.cs oben "FilterConfig.RegisterGlobalFilters (GlobalFilters.Filters);"

%Vor%

Nachdem Ihr Benutzer das Setup vollständig abgeschlossen hat, können Sie die App-Domain entfernen:

%Vor%

Bitte beachten Sie: Sie müssen sicherstellen, dass Ihre App die Berechtigung zum Entladen der AppDomain besitzt. Wenn dies nicht der Fall ist, können Sie File.SetLastWriteTimeUtc (...) in der Konfigurationsdatei (AppDomain.CurrentDomain.SetupInformation.ConfigurationFile) ausprobieren. Dadurch wird auch die AppDomain entladen.

Durch das Entladen der AppDomain wird die Webanwendung neu gestartet und Application_Start () erneut aufgerufen. Der Filter wird Ihren Anfragen nicht hinzugefügt, da Ihre if-Anweisung festlegt, dass die App bereits konfiguriert wurde.

    
agriffin 10.08.2016, 22:31
quelle
0

Als Workaround können Sie faule Initialisierung verwenden eine statische Variable innerhalb eines Filters. Die eigentlichen Dateioperationen zur Überprüfung der Konfigurationsdatei werden nur einmal während der ersten Anfrage ausgeführt. Danach wird der Wert der Überprüfung für die Konfigurationsdatei in der Variable static Lazy gespeichert. Als zusätzlicher Bonus ist es auch Threadssafe.

Am Ende findet die Überprüfung immer noch bei jeder Anfrage statt, aber die Operation ist nach der ersten Überprüfung schnell, weil das Ergebnis der Überprüfung im Speicher gespeichert wird.

%Vor%

Das letzte Bit ist, den Filter in Ihrem App_Start / FilterConfig.cs zu registrieren:

%Vor%     
Dean Goodman 10.08.2016 21:29
quelle
0

Wenn Sie diese Funktion für eine bestimmte Seite benötigen, verwenden Sie Cookies wie unten in der Aktion:

%Vor%

Wenn Sie für jede Aktionsmethode verwenden möchten, müssen Sie ein ActionFilterAttribute schreiben, um es bei Bedarf aufzurufen.

Beachten Sie, dass das Request.Context nicht mehr für das Application_Start -Ereignis verfügbar ist

    
Amirhossein Mehrvarzi 14.08.2016 01:31
quelle

Tags und Links