2016-08-10 4 views
9

Ich habe eine ASP.NET Core-Anwendung. Die Anwendung muss vom Windows-Dienst gestartet werden. Wenn der Dienst die Anwendung ausgeführt wird, ich bin mit den folgenden Fehler:ASP.NET Core konnte keine Ansichten finden

InvalidOperationException: The view 'Index' was not found. The following locations were searched: 
/Views/Home/Index.cshtml 
/Views/Shared/Index.cshtml 
EnsureSuccessful 
MoveNext 
ThrowForNonSuccess 
HandleNonSuccessAndDebuggerNotification 
MoveNext 
ThrowForNonSuccess 
HandleNonSuccessAndDebuggerNotification 
MoveNext 
MoveNext 
ThrowForNonSuccess 
HandleNonSuccessAndDebuggerNotification 
MoveNext 
MoveNext 
ThrowForNonSuccess 
HandleNonSuccessAndDebuggerNotification 
MoveNext 
ThrowForNonSuccess 
HandleNonSuccessAndDebuggerNotification 
MoveNext 
ThrowForNonSuccess 
HandleNonSuccessAndDebuggerNotification 
MoveNext 

Allerdings, wenn ich die Anwendung durch Klicken auf die exe-Datei ausführen, scheint alles normal zu sein. Ich überprüfte doppelt, der Dienst hatte genug Berechtigungen, und die Ansichten sind an der richtigen Stelle.

ABER! Ich hatte eine Situation, als der Dienst nach einer anderen Datei irgendwo im Win32-Ordner suchte, weil ich einen Fehler gemacht hatte und Directory.GetCurrentDirectory() anstelle von Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) benutzte, um den aktuellen Ordner zu finden. Ist es möglich, dass der ähnliche Fehler gemacht wurde?

+2

Versuchen Sie, beim Starten des Dienstes das aktuelle Verzeichnis festzulegen. Die Standardeinstellung ist System32 Ich denke –

+1

@ Aleksey L. Danke, ich habe es gerade herausgefunden! : D –

Antwort

7

Das aktuelle Problem war in der Tat ähnlich dem ersteren. Haupt

var host = new WebHostBuilder() 
    .UseKestrel() 
    .UseConfiguration(config) 
    .UseContentRoot(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)) 
    .UseStartup<Startup>() 
    .Build(); 

wo standardmäßig Directory.GetCurrentDirectory() für UseContentRoot(.) als Argument verwendet: Wie sich herausstellte, sollte ich das gleiche Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) in Startup.cs verwendet haben. Auch die gleiche Operation muss früher mehrere Zeilen Code ausgeführt werden, wenn ConfigurationBuilder aufgerufen wird.

Die Wurzel des Problems ist, dass der Windows-Dienst von Win32-Ordner aufgerufen wird, so Directory.GetCurrentDirectory() gibt Win32-Ordner statt Ordner der ausführbaren Datei.

Verwandte Themen