2016-08-10 16 views
9

Mam aplikację ASP.NET Core. Aplikacja musi być uruchomiona przez usługę Windows. Gdy usługa uruchamia aplikację, mam następujący błąd:ASP.NET Core nie może znaleźć widoków

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 

Jeśli jednak uruchomić aplikację klikając na plik exe, wszystko wydaje się być normalne. Sprawdziłem dwukrotnie, usługa miała wystarczające uprawnienia, a widoki są we właściwym miejscu.

ALE! Miałem sytuację, gdy usługa szukała innego pliku gdzieś w folderze win32, ponieważ popełniłem błąd i użyłem Directory.GetCurrentDirectory() zamiast Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), aby znaleźć bieżący folder. Czy to możliwe, że podobny błąd został popełniony?

+2

Spróbuj ustawić bieżący katalog przy uruchomieniu usługi. Domyślnie jest System32 Myślę, że –

+1

@ Aleksey L. Dzięki, właśnie to rozgryzłem! :RE –

Odpowiedz

7

Obecny problem był rzeczywiście podobny do poprzedniego. Jak się okazało, należy Użyłem tego samego Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) w Startup.cs: Main

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

gdzie domyślnie Directory.GetCurrentDirectory() został użyty jako argument dla UseContentRoot(.). Również ta sama operacja musi zostać wykonana kilka linii kodu wcześniej, gdy zostanie wywołana ConfigurationBuilder.

Źródłem problemu jest wywołanie usługi Windows z folderu win32, więc Directory.GetCurrentDirectory() podaje folder win32 zamiast folderu z plikiem wykonywalnym.