Hostowanie ASP.NET Core w usłudze Windows

Aplikację ASP.NET Core można hostować na Windows jako usługa Windows bez używania usług IIS. Gdy aplikacja jest hostowana jako usługa Windows, aplikacja jest uruchamiana automatycznie po ponownym uruchomieniu serwera.

Wyświetl lub pobierz przykładowy kod (jak pobrać)

Wymagania wstępne

Szablon usługi procesu roboczego

Szablon usługi ASP.NET Core Worker Service zawiera punkt wyjścia do pisania długotrwałych aplikacji usług. Aby użyć szablonu jako podstawy dla aplikacji usługi Windows Service:

  1. Utwórz aplikację usługi Worker Service na podstawie szablonu platformy .NET Core.
  2. Postępuj zgodnie ze wskazówkami w sekcji Konfiguracja aplikacji, aby zaktualizować aplikację usługi Worker Service, aby mogła działać jako usługa Windows Service.
  1. Tworzenie nowego projektu.
  2. Wybierz pozycję Usługa procesu roboczego. Wybierz opcję Dalej.
  3. Podaj nazwę projektu w polu nazwa Project lub zaakceptuj domyślną nazwę projektu. Wybierz przycisk Utwórz.
  4. W oknie dialogowym Tworzenie nowej usługi Procesu roboczego wybierz pozycję Utwórz.

Konfiguracja aplikacji

Aplikacja wymaga odwołania do pakietu microsoft.Extensions.Hosting.WindowsServices.

IHostBuilder.UseWindowsService element jest wywoływany podczas tworzenia hosta. Jeśli aplikacja jest uruchomiona jako usługa Windows, metoda:

  • Ustawia okres istnienia hosta na WindowsServiceLifetimewartość .
  • Ustawia katalog główny zawartości na AppContext.BaseDirectory. Aby uzyskać więcej informacji, zobacz sekcję Bieżący katalog i katalog główny zawartości .
  • Włącza rejestrowanie w dzienniku zdarzeń:
    • Nazwa aplikacji jest używana jako domyślna nazwa źródła.
    • Domyślny poziom dziennika to Ostrzeżenie lub wyższe dla aplikacji na podstawie szablonu ASP.NET Core wywołującego CreateDefaultBuilder w celu skompilowania hosta.
    • Zastąpij domyślny poziom dziennika przy użyciu Logging:EventLog:LogLevel:Default klucza w appsettings.json/appsettings.{Environment}.json lub innego dostawcy konfiguracji.
    • Tylko administratorzy mogą tworzyć nowe źródła zdarzeń. Jeśli nie można utworzyć źródła zdarzeń przy użyciu nazwy aplikacji, ostrzeżenie jest rejestrowane w źródle aplikacji , a dzienniki zdarzeń są wyłączone.

W CreateHostBuilder pliku :Program.cs

Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    ...

Następujące przykładowe aplikacje towarzyszą temu tematowi:

Aby uzyskać wskazówki dotyczące wzorca MVC, zobacz artykuły w sekcji Omówienie ASP.NET Core MVC i Migrowanie z ASP.NET Core 2.2 do 3.0.

Typ wdrożenia

Aby uzyskać informacje i porady dotyczące scenariuszy wdrażania, zobacz Wdrażanie aplikacji platformy .NET Core.

SDK

W przypadku usługi opartej na aplikacji internetowej korzystającej ze Razor struktur Pages lub MVC określ zestaw SDK sieci Web w pliku projektu:

<Project Sdk="Microsoft.NET.Sdk.Web">

Jeśli usługa wykonuje tylko zadania w tle (na przykład hostowane usługi), określ zestaw SDK procesu roboczego w pliku projektu:

<Project Sdk="Microsoft.NET.Sdk.Worker">

Wdrażanie zależne od struktury (FDD)

Wdrożenie zależne od struktury (FDD) opiera się na obecności współużytkowanej wersji platformy .NET Core w systemie docelowym. Po przyjęciu scenariusza FDD zgodnie ze wskazówkami w tym artykule zestaw SDK tworzy plik wykonywalny (.exe), nazywany plikiem wykonywalnym zależnym od struktury.

W przypadku korzystania z zestawu SDK sieci Web plik web.config, który jest zwykle generowany podczas publikowania aplikacji ASP.NET Core, jest zbędny dla aplikacji usługi Windows Services. Aby wyłączyć tworzenie pliku web.config , dodaj właściwość ustawioną <IsTransformWebConfigDisabled> na wartość true.

<PropertyGroup>
  <TargetFramework>netcoreapp3.0</TargetFramework>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

Wdrażanie samodzielne (SCD)

Wdrożenie samodzielne (SCD) nie polega na obecności struktury udostępnionej w systemie hosta. Środowisko uruchomieniowe i zależności aplikacji są wdrażane z aplikacją.

Identyfikator środowiska uruchomieniowego (RID) Windows znajduje się w obiekcie <PropertyGroup> zawierającym platformę docelową:

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Aby opublikować dla wielu identyfikatorów RID:

Aby uzyskać więcej informacji, zobacz Katalog identyfikatorów RID platformy .NET Core.

Konto użytkownika usługi

Aby utworzyć konto użytkownika dla usługi, użyj polecenia cmdlet New-LocalUser z administracyjnej powłoki poleceń programu PowerShell 6.

W Aktualizacja systemu Windows 10 z października 2018 (wersja 1809/kompilacja 10.0.17763) lub nowsza:

New-LocalUser -Name {SERVICE NAME}

W systemie operacyjnym Windows starszym niż Aktualizacja systemu Windows 10 z października 2018 (wersja 1809/kompilacja 10.0.17763):

powershell -Command "New-LocalUser -Name {SERVICE NAME}"

Po wyświetleniu monitu podaj silne hasło .

Jeśli parametr nie -AccountExpires zostanie dostarczony do polecenia cmdlet New-LocalUser z wygaśnięciem DateTime, konto nie wygaśnie.

Aby uzyskać więcej informacji, zobacz Microsoft.PowerShell.LocalAccounts i Konta użytkowników usługi.

Alternatywnym podejściem do zarządzania użytkownikami w przypadku korzystania z usługi Active Directory jest użycie zarządzanych kont usług. Aby uzyskać więcej informacji, zobacz Omówienie kont usług zarządzanych przez grupę.

Logowanie jako prawa do usługi

Aby ustanowić prawa logowania jako usługi dla konta użytkownika usługi:

  1. Otwórz edytor lokalnych zasad zabezpieczeń, uruchamiając polecenie secpol.msc.
  2. Rozwiń węzeł Zasady lokalne i wybierz pozycję Przypisanie praw użytkownika.
  3. Otwórz zasady Logowanie jako usługa .
  4. Wybierz pozycję Dodaj użytkownika lub grupę.
  5. Podaj nazwę obiektu (konto użytkownika) przy użyciu jednej z następujących metod:
    1. Wpisz konto użytkownika ({DOMAIN OR COMPUTER NAME\USER}) w polu nazwa obiektu i wybierz przycisk OK , aby dodać użytkownika do zasad.
    2. Wybierz pozycję Zaawansowane. Wybierz pozycję Znajdź teraz. Wybierz konto użytkownika z listy. Wybierz przycisk OK. Ponownie wybierz przycisk OK , aby dodać użytkownika do zasad.
  6. Wybierz przycisk OK lub Zastosuj , aby zaakceptować zmiany.

Tworzenie usługi Windows i zarządzanie nią

Tworzenie usługi

Użyj poleceń programu PowerShell, aby zarejestrować usługę. W administracyjnej powłoce poleceń programu PowerShell 6 wykonaj następujące polecenia:

$acl = Get-Acl "{EXE PATH}"
$aclRuleArgs = "{DOMAIN OR COMPUTER NAME\USER}", "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "{EXE PATH}"

New-Service -Name {SERVICE NAME} -BinaryPathName "{EXE FILE PATH} --contentRoot {EXE FOLDER PATH}" -Credential "{DOMAIN OR COMPUTER NAME\USER}" -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
  • {EXE PATH}: ścieżka pliku wykonywalnego aplikacji na hoście (na przykład d:\myservice). Nie dołączaj nazwy pliku wykonywalnego aplikacji do ścieżki. Końcowy ukośnik nie jest wymagany.
  • {DOMAIN OR COMPUTER NAME\USER}: Konto użytkownika usługi (na przykład Contoso\ServiceUser).
  • {SERVICE NAME}: Nazwa usługi (na przykład MyService).
  • {EXE FILE PATH}: pełna ścieżka wykonywalna aplikacji (na przykład d:\myservice\myservice.exe). Dołącz nazwę pliku wykonywalnego z rozszerzeniem .
  • {EXE FOLDER PATH}: pełna ścieżka folderu wykonywalnego aplikacji (na przykład d:\myservice).
  • {DESCRIPTION}: Opis usługi (na przykład My sample service).
  • {DISPLAY NAME}: nazwa wyświetlana usługi (na przykład My Service).

Uruchamianie usługi

Uruchom usługę za pomocą następującego polecenia programu PowerShell 6:

Start-Service -Name {SERVICE NAME}

Uruchomienie usługi trwa kilka sekund.

Określanie stanu usługi

Aby sprawdzić stan usługi, użyj następującego polecenia programu PowerShell 6:

Get-Service -Name {SERVICE NAME}

Stan jest zgłaszany jako jedna z następujących wartości:

  • Starting
  • Running
  • Stopping
  • Stopped

Zatrzymywanie usługi

Zatrzymaj usługę za pomocą następującego polecenia programu PowerShell 6:

Stop-Service -Name {SERVICE NAME}

Usuwanie usługi

Po krótkim opóźnieniu, aby zatrzymać usługę, usuń usługę za pomocą następującego polecenia programu PowerShell 6:

Remove-Service -Name {SERVICE NAME}

Scenariusze serwera proxy i modułu równoważenia obciążenia

Usługi, które współdziałają z żądaniami z Internetu lub sieci firmowej i znajdują się za serwerem proxy lub modułem równoważenia obciążenia, mogą wymagać dodatkowej konfiguracji. Aby uzyskać więcej informacji, zobacz Konfigurowanie ASP.NET Core do pracy z serwerami proxy i modułami równoważenia obciążenia.

Konfigurowanie punktów końcowych

Domyślnie ASP.NET Core wiąże się z .http://localhost:5000 Skonfiguruj adres URL i port, ustawiając zmienną ASPNETCORE_URLS środowiskową.

Aby uzyskać dodatkowe podejścia do konfiguracji adresów URL i portów, zobacz odpowiedni artykuł na temat serwera:

Powyższe wskazówki obejmują obsługę punktów końcowych HTTPS. Na przykład skonfiguruj aplikację dla protokołu HTTPS, gdy uwierzytelnianie jest używane z usługą Windows Service.

Uwaga

Używanie certyfikatu dewelopera ASP.NET Core HTTPS w celu zabezpieczenia punktu końcowego usługi nie jest obsługiwane.

Bieżący katalog i katalog główny zawartości

Bieżący katalog roboczy zwracany przez wywołanie GetCurrentDirectory usługi Windows to folder C:\WINDOWS\system32. Folder system32 nie jest odpowiednią lokalizacją do przechowywania plików usługi (na przykład plików ustawień). Użyj jednej z poniższych metod, aby zachować zasoby i pliki ustawień usługi i uzyskiwać do nich dostęp.

Używanie elementu ContentRootPath lub ContentRootFileProvider

Użyj elementu IHostEnvironment.ContentRootPath lub ContentRootFileProvider znajdź zasoby aplikacji.

Gdy aplikacja jest uruchamiana jako usługa, UseWindowsService ustawia parametr ContentRootPathna AppContext.BaseDirectory.

Domyślne pliki appsettings.json ustawień aplikacji i appsettings.{Environment}.json, są ładowane z katalogu głównego zawartości aplikacji przez wywołanie metody CreateDefaultBuilder podczas konstruowania hosta.

W przypadku innych plików ustawień załadowanych przez kod dewelopera w programie ConfigureAppConfigurationnie ma potrzeby wywoływania metody SetBasePath. W poniższym przykładzie custom_settings.json plik istnieje w katalogu głównym zawartości aplikacji i jest ładowany bez jawnego ustawienia ścieżki podstawowej:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseWindowsService()
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("custom_settings.json");
            })
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}

Nie próbuj użyć GetCurrentDirectory polecenia , aby uzyskać ścieżkę zasobu, ponieważ aplikacja usługi Windows zwraca folder C:\WINDOWS\system32 jako bieżący katalog.

Przechowywanie plików usługi w odpowiedniej lokalizacji na dysku

Określ ścieżkę bezwzględną w SetBasePath przypadku używania IConfigurationBuilder elementu do folderu zawierającego pliki.

Rozwiązywanie problemów

Aby rozwiązać problemy z aplikacją usługi Windows Service, zobacz Rozwiązywanie problemów i debugowanie projektów ASP.NET Core.

Typowe błędy

  • Używana jest stara lub wstępnie wydana wersja programu PowerShell.
  • Zarejestrowana usługa nie używa opublikowanych danych wyjściowych aplikacji z polecenia dotnet publish . Dane wyjściowe polecenia dotnet build nie są obsługiwane w przypadku wdrażania aplikacji. Opublikowane zasoby znajdują się w jednym z następujących folderów w zależności od typu wdrożenia:
    • bin/Release/{TARGET FRAMEWORK}/publish (FDD)
    • bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
  • Usługa nie jest w stanie URUCHOMIONYm.
  • Ścieżki do zasobów używanych przez aplikację (na przykład certyfikaty) są nieprawidłowe. Ścieżka podstawowa usługi Windows to c:\Windows\System32.
  • Użytkownik nie ma praw logowania jako usługi .
  • Hasło użytkownika wygasło lub niepoprawnie zostało przekazane podczas wykonywania New-Service polecenia programu PowerShell.
  • Aplikacja wymaga uwierzytelniania ASP.NET Core, ale nie jest skonfigurowana do bezpiecznych połączeń (HTTPS).
  • Port adresu URL żądania jest niepoprawny lub nie jest poprawnie skonfigurowany w aplikacji.

Dzienniki zdarzeń systemu i aplikacji

Uzyskaj dostęp do dzienników zdarzeń systemu i aplikacji:

  1. Otwórz menu Start, wyszukaj Podgląd zdarzeń i wybierz aplikację Podgląd zdarzeń.
  2. W Podgląd zdarzeń otwórz węzeł dzienników Windows.
  3. Wybierz pozycję System, aby otworzyć dziennik zdarzeń systemu. Wybierz pozycję Aplikacja , aby otworzyć dziennik zdarzeń aplikacji.
  4. Wyszukaj błędy skojarzone z aplikacją, która kończy się niepowodzeniem.

Uruchamianie aplikacji w wierszu polecenia

Wiele błędów uruchamiania nie generuje przydatnych informacji w dziennikach zdarzeń. Przyczynę niektórych błędów można znaleźć, uruchamiając aplikację w wierszu polecenia w systemie hostingu. Aby zarejestrować dodatkowe szczegóły z aplikacji, obniż poziom dziennika lub uruchom aplikację w środowisku deweloperów.

Czyszczenie pamięci podręcznych pakietów

Działająca aplikacja może zakończyć się niepowodzeniem natychmiast po uaktualnieniu zestawu .NET Core SDK na komputerze deweloperskim lub zmianie wersji pakietów w aplikacji. W niektórych przypadkach niespójne pakiety mogą spowodować przerwanie aplikacji podczas wykonywania głównych uaktualnień. Większość z tych problemów można rozwiązać, wykonując następujące instrukcje:

  1. Usuń pojemnik i foldery obj .

  2. Wyczyść pamięć podręczną pakietu, wykonując polecenie dotnet nuget locals all --clear z powłoki poleceń.

    Czyszczenie pamięci podręcznych pakietów można również wykonać za pomocą narzędzia nuget.exe i wykonania polecenia nuget locals all -clear. nuget.exe nie jest instalowana w pakiecie z systemem operacyjnym Windows desktop i musi zostać uzyskana oddzielnie od witryny sieci Web NuGet.

  3. Przywracanie i ponowne kompilowanie projektu.

  4. Usuń wszystkie pliki w folderze wdrażania na serwerze przed ponownym wdrożeniem aplikacji.

Powolna lub nieodpowiadjąca aplikacja

Zrzut awaryjny to migawka pamięci systemu i może pomóc w ustaleniu przyczyny awarii aplikacji, awarii uruchamiania lub powolnej aplikacji.

Aplikacja ulega awarii lub napotyka wyjątek

Uzyskiwanie i analizowanie zrzutu z Raportowanie błędów systemu Windows (Raportowanie błędów systemu Windows):

  1. Utwórz folder do przechowywania plików zrzutu awaryjnego w lokalizacji c:\dumps.

  2. Uruchom skrypt EnableDumps programu PowerShell z nazwą pliku wykonywalnego aplikacji:

    .\EnableDumps {APPLICATION EXE} c:\dumps
    
  3. Uruchom aplikację w warunkach, które powodują wystąpienie awarii.

  4. Po wystąpieniu awarii uruchom skrypt DisableDumps programu PowerShell:

    .\DisableDumps {APPLICATION EXE}
    

Po zakończeniu awarii aplikacji i zakończeniu zbierania zrzutów aplikacja może zakończyć działanie normalnie. Skrypt programu PowerShell konfiguruje Raportowanie błędów systemu Windows do zbierania maksymalnie pięciu zrzutów na aplikację.

Ostrzeżenie

Zrzuty awaryjne mogą zająć dużą ilość miejsca na dysku (do kilku gigabajtów każdy).

Aplikacja nie odpowiada, kończy się niepowodzeniem podczas uruchamiania lub działa normalnie

Gdy aplikacja zawiesza się (przestaje odpowiadać, ale nie ulega awarii), kończy się niepowodzeniem podczas uruchamiania lub działa normalnie, zobacz Pliki zrzutu w trybie użytkownika: Wybieranie najlepszego narzędzia , aby wybrać odpowiednie narzędzie do utworzenia zrzutu.

Analizowanie zrzutu

Zrzut można analizować przy użyciu kilku metod. Aby uzyskać więcej informacji, zobacz Analizowanie pliku zrzutu User-Mode.

Dodatkowe zasoby

Aplikację ASP.NET Core można hostować na Windows jako usługa Windows bez używania usług IIS. Gdy aplikacja jest hostowana jako usługa Windows, aplikacja jest uruchamiana automatycznie po ponownym uruchomieniu serwera.

Wyświetl lub pobierz przykładowy kod (jak pobrać)

Wymagania wstępne

Szablon usługi procesu roboczego

Szablon usługi ASP.NET Core Worker Service zawiera punkt wyjścia do pisania długotrwałych aplikacji usług. Aby użyć szablonu jako podstawy dla aplikacji usługi Windows Service:

  1. Utwórz aplikację usługi Worker Service na podstawie szablonu platformy .NET Core.
  2. Postępuj zgodnie ze wskazówkami w sekcji Konfiguracja aplikacji, aby zaktualizować aplikację usługi Worker Service, aby mogła działać jako usługa Windows Service.
  1. Tworzenie nowego projektu.
  2. Wybierz pozycję Usługa procesu roboczego. Wybierz opcję Dalej.
  3. Podaj nazwę projektu w polu nazwa Project lub zaakceptuj domyślną nazwę projektu. Wybierz przycisk Utwórz.
  4. W oknie dialogowym Tworzenie nowej usługi Procesu roboczego wybierz pozycję Utwórz.

Konfiguracja aplikacji

Aplikacja wymaga odwołania do pakietu microsoft.Extensions.Hosting.WindowsServices.

IHostBuilder.UseWindowsService element jest wywoływany podczas tworzenia hosta. Jeśli aplikacja jest uruchomiona jako usługa Windows, metoda:

  • Ustawia okres istnienia hosta na WindowsServiceLifetimewartość .
  • Ustawia katalog główny zawartości na AppContext.BaseDirectory. Aby uzyskać więcej informacji, zobacz sekcję Bieżący katalog i katalog główny zawartości .
  • Włącza rejestrowanie w dzienniku zdarzeń:
    • Nazwa aplikacji jest używana jako domyślna nazwa źródła.
    • Domyślny poziom dziennika to Ostrzeżenie lub wyższe dla aplikacji na podstawie szablonu ASP.NET Core wywołującego CreateDefaultBuilder w celu skompilowania hosta.
    • Zastąpij domyślny poziom dziennika przy użyciu Logging:EventLog:LogLevel:Default klucza w appsettings.json/appsettings.{Environment}.json lub innego dostawcy konfiguracji.
    • Tylko administratorzy mogą tworzyć nowe źródła zdarzeń. Jeśli nie można utworzyć źródła zdarzeń przy użyciu nazwy aplikacji, ostrzeżenie jest rejestrowane w źródle aplikacji , a dzienniki zdarzeń są wyłączone.

W CreateHostBuilder pliku :Program.cs

Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    ...

Następujące przykładowe aplikacje towarzyszą temu tematowi:

Aby uzyskać wskazówki dotyczące wzorca MVC, zobacz artykuły w sekcji Omówienie ASP.NET Core MVC i Migrowanie z ASP.NET Core 2.2 do 3.0.

Typ wdrożenia

Aby uzyskać informacje i porady dotyczące scenariuszy wdrażania, zobacz Wdrażanie aplikacji platformy .NET Core.

SDK

W przypadku usługi opartej na aplikacji internetowej korzystającej ze Razor struktur Pages lub MVC określ zestaw SDK sieci Web w pliku projektu:

<Project Sdk="Microsoft.NET.Sdk.Web">

Jeśli usługa wykonuje tylko zadania w tle (na przykład hostowane usługi), określ zestaw SDK procesu roboczego w pliku projektu:

<Project Sdk="Microsoft.NET.Sdk.Worker">

Wdrażanie zależne od struktury (FDD)

Wdrożenie zależne od struktury (FDD) opiera się na obecności współużytkowanej wersji platformy .NET Core w systemie docelowym. Po przyjęciu scenariusza FDD zgodnie ze wskazówkami w tym artykule zestaw SDK tworzy plik wykonywalny (.exe), nazywany plikiem wykonywalnym zależnym od struktury.

W przypadku korzystania z zestawu SDK sieci Web plik web.config, który jest zwykle generowany podczas publikowania aplikacji ASP.NET Core, jest zbędny dla aplikacji usługi Windows Services. Aby wyłączyć tworzenie pliku web.config , dodaj właściwość ustawioną <IsTransformWebConfigDisabled> na wartość true.

<PropertyGroup>
  <TargetFramework>netcoreapp3.0</TargetFramework>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

Wdrażanie samodzielne (SCD)

Wdrożenie samodzielne (SCD) nie polega na obecności struktury udostępnionej w systemie hosta. Środowisko uruchomieniowe i zależności aplikacji są wdrażane z aplikacją.

Identyfikator środowiska uruchomieniowego (RID) Windows znajduje się w obiekcie <PropertyGroup> zawierającym platformę docelową:

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Aby opublikować dla wielu identyfikatorów RID:

Aby uzyskać więcej informacji, zobacz Katalog identyfikatorów RID platformy .NET Core.

Konto użytkownika usługi

Aby utworzyć konto użytkownika dla usługi, użyj polecenia cmdlet New-LocalUser z administracyjnej powłoki poleceń programu PowerShell 6.

W Aktualizacja systemu Windows 10 z października 2018 (wersja 1809/kompilacja 10.0.17763) lub nowsza:

New-LocalUser -Name {SERVICE NAME}

W systemie operacyjnym Windows starszym niż Aktualizacja systemu Windows 10 z października 2018 (wersja 1809/kompilacja 10.0.17763):

powershell -Command "New-LocalUser -Name {SERVICE NAME}"

Po wyświetleniu monitu podaj silne hasło .

Jeśli parametr nie -AccountExpires zostanie dostarczony do polecenia cmdlet New-LocalUser z wygaśnięciem DateTime, konto nie wygaśnie.

Aby uzyskać więcej informacji, zobacz Microsoft.PowerShell.LocalAccounts i Konta użytkowników usługi.

Alternatywnym podejściem do zarządzania użytkownikami w przypadku korzystania z usługi Active Directory jest użycie zarządzanych kont usług. Aby uzyskać więcej informacji, zobacz Omówienie kont usług zarządzanych przez grupę.

Logowanie jako prawa do usługi

Aby ustanowić prawa logowania jako usługi dla konta użytkownika usługi:

  1. Otwórz edytor lokalnych zasad zabezpieczeń, uruchamiając polecenie secpol.msc.
  2. Rozwiń węzeł Zasady lokalne i wybierz pozycję Przypisanie praw użytkownika.
  3. Otwórz zasady Logowanie jako usługa .
  4. Wybierz pozycję Dodaj użytkownika lub grupę.
  5. Podaj nazwę obiektu (konto użytkownika) przy użyciu jednej z następujących metod:
    1. Wpisz konto użytkownika ({DOMAIN OR COMPUTER NAME\USER}) w polu nazwa obiektu i wybierz przycisk OK , aby dodać użytkownika do zasad.
    2. Wybierz pozycję Zaawansowane. Wybierz pozycję Znajdź teraz. Wybierz konto użytkownika z listy. Wybierz przycisk OK. Ponownie wybierz przycisk OK , aby dodać użytkownika do zasad.
  6. Wybierz przycisk OK lub Zastosuj , aby zaakceptować zmiany.

Tworzenie usługi Windows i zarządzanie nią

Tworzenie usługi

Użyj poleceń programu PowerShell, aby zarejestrować usługę. W administracyjnej powłoce poleceń programu PowerShell 6 wykonaj następujące polecenia:

$acl = Get-Acl "{EXE PATH}"
$aclRuleArgs = "{DOMAIN OR COMPUTER NAME\USER}", "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "{EXE PATH}"

New-Service -Name {SERVICE NAME} -BinaryPathName "{EXE FILE PATH}" -Credential "{DOMAIN OR COMPUTER NAME\USER}" -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
  • {EXE PATH}: ścieżka pliku wykonywalnego aplikacji na hoście (na przykład d:\myservice). Nie dołączaj nazwy pliku wykonywalnego aplikacji do ścieżki. Końcowy ukośnik nie jest wymagany.
  • {DOMAIN OR COMPUTER NAME\USER}: Konto użytkownika usługi (na przykład Contoso\ServiceUser).
  • {SERVICE NAME}: Nazwa usługi (na przykład MyService).
  • {EXE FILE PATH}: pełna ścieżka wykonywalna aplikacji (na przykład d:\myservice\myservice.exe). Dołącz nazwę pliku wykonywalnego z rozszerzeniem .
  • {DESCRIPTION}: Opis usługi (na przykład My sample service).
  • {DISPLAY NAME}: nazwa wyświetlana usługi (na przykład My Service).

Uruchamianie usługi

Uruchom usługę za pomocą następującego polecenia programu PowerShell 6:

Start-Service -Name {SERVICE NAME}

Uruchomienie usługi trwa kilka sekund.

Określanie stanu usługi

Aby sprawdzić stan usługi, użyj następującego polecenia programu PowerShell 6:

Get-Service -Name {SERVICE NAME}

Stan jest zgłaszany jako jedna z następujących wartości:

  • Starting
  • Running
  • Stopping
  • Stopped

Zatrzymywanie usługi

Zatrzymaj usługę za pomocą następującego polecenia programu PowerShell 6:

Stop-Service -Name {SERVICE NAME}

Usuwanie usługi

Po krótkim opóźnieniu, aby zatrzymać usługę, usuń usługę za pomocą następującego polecenia programu PowerShell 6:

Remove-Service -Name {SERVICE NAME}

Scenariusze serwera proxy i modułu równoważenia obciążenia

Usługi, które współdziałają z żądaniami z Internetu lub sieci firmowej i znajdują się za serwerem proxy lub modułem równoważenia obciążenia, mogą wymagać dodatkowej konfiguracji. Aby uzyskać więcej informacji, zobacz Konfigurowanie ASP.NET Core do pracy z serwerami proxy i modułami równoważenia obciążenia.

Konfigurowanie punktów końcowych

Domyślnie ASP.NET Core wiąże się z .http://localhost:5000 Skonfiguruj adres URL i port, ustawiając zmienną ASPNETCORE_URLS środowiskową.

Aby uzyskać dodatkowe podejścia do konfiguracji adresów URL i portów, zobacz odpowiedni artykuł na temat serwera:

Powyższe wskazówki obejmują obsługę punktów końcowych HTTPS. Na przykład skonfiguruj aplikację dla protokołu HTTPS, gdy uwierzytelnianie jest używane z usługą Windows Service.

Uwaga

Używanie certyfikatu dewelopera ASP.NET Core HTTPS w celu zabezpieczenia punktu końcowego usługi nie jest obsługiwane.

Bieżący katalog i katalog główny zawartości

Bieżący katalog roboczy zwracany przez wywołanie GetCurrentDirectory usługi Windows to folder C:\WINDOWS\system32. Folder system32 nie jest odpowiednią lokalizacją do przechowywania plików usługi (na przykład plików ustawień). Użyj jednej z poniższych metod, aby zachować zasoby i pliki ustawień usługi i uzyskiwać do nich dostęp.

Używanie elementu ContentRootPath lub ContentRootFileProvider

Użyj elementu IHostEnvironment.ContentRootPath lub ContentRootFileProvider znajdź zasoby aplikacji.

Gdy aplikacja jest uruchamiana jako usługa, UseWindowsService ustawia parametr ContentRootPathna AppContext.BaseDirectory.

Domyślne pliki appsettings.json ustawień aplikacji i appsettings.{Environment}.json, są ładowane z katalogu głównego zawartości aplikacji przez wywołanie metody CreateDefaultBuilder podczas konstruowania hosta.

W przypadku innych plików ustawień załadowanych przez kod dewelopera w programie ConfigureAppConfigurationnie ma potrzeby wywoływania metody SetBasePath. W poniższym przykładzie custom_settings.json plik istnieje w katalogu głównym zawartości aplikacji i jest ładowany bez jawnego ustawienia ścieżki podstawowej:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseWindowsService()
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("custom_settings.json");
            })
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}

Nie próbuj użyć GetCurrentDirectory polecenia , aby uzyskać ścieżkę zasobu, ponieważ aplikacja usługi Windows zwraca folder C:\WINDOWS\system32 jako bieżący katalog.

Przechowywanie plików usługi w odpowiedniej lokalizacji na dysku

Określ ścieżkę bezwzględną w SetBasePath przypadku używania IConfigurationBuilder elementu do folderu zawierającego pliki.

Rozwiązywanie problemów

Aby rozwiązać problemy z aplikacją usługi Windows Service, zobacz Rozwiązywanie problemów i debugowanie projektów ASP.NET Core.

Typowe błędy

  • Używana jest stara lub wstępnie wydana wersja programu PowerShell.
  • Zarejestrowana usługa nie używa opublikowanych danych wyjściowych aplikacji z polecenia dotnet publish . Dane wyjściowe polecenia dotnet build nie są obsługiwane w przypadku wdrażania aplikacji. Opublikowane zasoby znajdują się w jednym z następujących folderów w zależności od typu wdrożenia:
    • bin/Release/{TARGET FRAMEWORK}/publish (FDD)
    • bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
  • Usługa nie jest w stanie URUCHOMIONYm.
  • Ścieżki do zasobów używanych przez aplikację (na przykład certyfikaty) są nieprawidłowe. Ścieżka podstawowa usługi Windows to c:\Windows\System32.
  • Użytkownik nie ma praw logowania jako usługi .
  • Hasło użytkownika wygasło lub niepoprawnie zostało przekazane podczas wykonywania New-Service polecenia programu PowerShell.
  • Aplikacja wymaga uwierzytelniania ASP.NET Core, ale nie jest skonfigurowana do bezpiecznych połączeń (HTTPS).
  • Port adresu URL żądania jest niepoprawny lub nie jest poprawnie skonfigurowany w aplikacji.

Dzienniki zdarzeń systemu i aplikacji

Uzyskaj dostęp do dzienników zdarzeń systemu i aplikacji:

  1. Otwórz menu Start, wyszukaj Podgląd zdarzeń i wybierz aplikację Podgląd zdarzeń.
  2. W Podgląd zdarzeń otwórz węzeł dzienników Windows.
  3. Wybierz pozycję System, aby otworzyć dziennik zdarzeń systemu. Wybierz pozycję Aplikacja , aby otworzyć dziennik zdarzeń aplikacji.
  4. Wyszukaj błędy skojarzone z aplikacją, która kończy się niepowodzeniem.

Uruchamianie aplikacji w wierszu polecenia

Wiele błędów uruchamiania nie generuje przydatnych informacji w dziennikach zdarzeń. Przyczynę niektórych błędów można znaleźć, uruchamiając aplikację w wierszu polecenia w systemie hostingu. Aby zarejestrować dodatkowe szczegóły z aplikacji, obniż poziom dziennika lub uruchom aplikację w środowisku deweloperów.

Czyszczenie pamięci podręcznych pakietów

Działająca aplikacja może zakończyć się niepowodzeniem natychmiast po uaktualnieniu zestawu .NET Core SDK na komputerze deweloperskim lub zmianie wersji pakietów w aplikacji. W niektórych przypadkach niespójne pakiety mogą spowodować przerwanie aplikacji podczas wykonywania głównych uaktualnień. Większość z tych problemów można rozwiązać, wykonując następujące instrukcje:

  1. Usuń pojemnik i foldery obj .

  2. Wyczyść pamięć podręczną pakietu, wykonując polecenie dotnet nuget locals all --clear z powłoki poleceń.

    Czyszczenie pamięci podręcznych pakietów można również wykonać za pomocą narzędzia nuget.exe i wykonania polecenia nuget locals all -clear. nuget.exe nie jest instalowana w pakiecie z systemem operacyjnym Windows desktop i musi zostać uzyskana oddzielnie od witryny sieci Web NuGet.

  3. Przywracanie i ponowne kompilowanie projektu.

  4. Usuń wszystkie pliki w folderze wdrażania na serwerze przed ponownym wdrożeniem aplikacji.

Powolna lub nieodpowiadjąca aplikacja

Zrzut awaryjny to migawka pamięci systemu i może pomóc w ustaleniu przyczyny awarii aplikacji, awarii uruchamiania lub powolnej aplikacji.

Aplikacja ulega awarii lub napotyka wyjątek

Uzyskiwanie i analizowanie zrzutu z Raportowanie błędów systemu Windows (Raportowanie błędów systemu Windows):

  1. Utwórz folder do przechowywania plików zrzutu awaryjnego w lokalizacji c:\dumps.

  2. Uruchom skrypt EnableDumps programu PowerShell z nazwą pliku wykonywalnego aplikacji:

    .\EnableDumps {APPLICATION EXE} c:\dumps
    
  3. Uruchom aplikację w warunkach, które powodują wystąpienie awarii.

  4. Po wystąpieniu awarii uruchom skrypt DisableDumps programu PowerShell:

    .\DisableDumps {APPLICATION EXE}
    

Po zakończeniu awarii aplikacji i zakończeniu zbierania zrzutów aplikacja może zakończyć działanie normalnie. Skrypt programu PowerShell konfiguruje Raportowanie błędów systemu Windows do zbierania maksymalnie pięciu zrzutów na aplikację.

Ostrzeżenie

Zrzuty awaryjne mogą zająć dużą ilość miejsca na dysku (do kilku gigabajtów każdy).

Aplikacja nie odpowiada, kończy się niepowodzeniem podczas uruchamiania lub działa normalnie

Gdy aplikacja zawiesza się (przestaje odpowiadać, ale nie ulega awarii), kończy się niepowodzeniem podczas uruchamiania lub działa normalnie, zobacz Pliki zrzutu w trybie użytkownika: Wybieranie najlepszego narzędzia , aby wybrać odpowiednie narzędzie do utworzenia zrzutu.

Analizowanie zrzutu

Zrzut można analizować przy użyciu kilku metod. Aby uzyskać więcej informacji, zobacz Analizowanie pliku zrzutu User-Mode.

Dodatkowe zasoby

Aplikację ASP.NET Core można hostować na Windows jako usługa Windows bez używania usług IIS. Gdy aplikacja jest hostowana jako usługa Windows, aplikacja jest uruchamiana automatycznie po ponownym uruchomieniu serwera.

Wyświetl lub pobierz przykładowy kod (jak pobrać)

Wymagania wstępne

Szablon usługi procesu roboczego

Szablon usługi ASP.NET Core Worker Service zawiera punkt wyjścia do pisania długotrwałych aplikacji usług. Aby użyć szablonu jako podstawy dla aplikacji usługi Windows Service:

  1. Utwórz aplikację usługi Worker Service na podstawie szablonu platformy .NET Core.
  2. Postępuj zgodnie ze wskazówkami w sekcji Konfiguracja aplikacji, aby zaktualizować aplikację usługi Worker Service, aby mogła działać jako usługa Windows Service.
  1. Tworzenie nowego projektu.
  2. Wybierz pozycję Usługa procesu roboczego. Wybierz opcję Dalej.
  3. Podaj nazwę projektu w polu nazwa Project lub zaakceptuj domyślną nazwę projektu. Wybierz przycisk Utwórz.
  4. W oknie dialogowym Tworzenie nowej usługi Procesu roboczego wybierz pozycję Utwórz.

Konfiguracja aplikacji

Aplikacja wymaga odwołania do pakietu microsoft.Extensions.Hosting.WindowsServices.

IHostBuilder.UseWindowsService element jest wywoływany podczas tworzenia hosta. Jeśli aplikacja jest uruchomiona jako usługa Windows, metoda:

  • Ustawia okres istnienia hosta na WindowsServiceLifetimewartość .
  • Ustawia katalog główny zawartości na AppContext.BaseDirectory. Aby uzyskać więcej informacji, zobacz sekcję Bieżący katalog i katalog główny zawartości .
  • Włącza rejestrowanie w dzienniku zdarzeń:
    • Nazwa aplikacji jest używana jako domyślna nazwa źródła.
    • Domyślny poziom dziennika to Ostrzeżenie lub wyższe dla aplikacji na podstawie szablonu ASP.NET Core wywołującego CreateDefaultBuilder w celu skompilowania hosta.
    • Zastąpij domyślny poziom dziennika przy użyciu Logging:EventLog:LogLevel:Default klucza w appsettings.json/appsettings.{Environment}.json lub innego dostawcy konfiguracji.
    • Tylko administratorzy mogą tworzyć nowe źródła zdarzeń. Jeśli nie można utworzyć źródła zdarzeń przy użyciu nazwy aplikacji, ostrzeżenie jest rejestrowane w źródle aplikacji , a dzienniki zdarzeń są wyłączone.

W CreateHostBuilder pliku :Program.cs

Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    ...

Następujące przykładowe aplikacje towarzyszą temu tematowi:

Aby uzyskać wskazówki dotyczące wzorca MVC, zobacz artykuły w sekcji Omówienie ASP.NET Core MVC i Migrowanie z ASP.NET Core 2.2 do 3.0.

Typ wdrożenia

Aby uzyskać informacje i porady dotyczące scenariuszy wdrażania, zobacz Wdrażanie aplikacji platformy .NET Core.

SDK

W przypadku usługi opartej na aplikacji internetowej korzystającej ze Razor struktur Pages lub MVC określ zestaw SDK sieci Web w pliku projektu:

<Project Sdk="Microsoft.NET.Sdk.Web">

Jeśli usługa wykonuje tylko zadania w tle (na przykład hostowane usługi), określ zestaw SDK procesu roboczego w pliku projektu:

<Project Sdk="Microsoft.NET.Sdk.Worker">

Wdrażanie zależne od struktury (FDD)

Wdrożenie zależne od struktury (FDD) opiera się na obecności współużytkowanej wersji platformy .NET Core w systemie docelowym. Po przyjęciu scenariusza FDD zgodnie ze wskazówkami w tym artykule zestaw SDK tworzy plik wykonywalny (.exe), nazywany plikiem wykonywalnym zależnym od struktury.

W przypadku korzystania z zestawu SDK sieci Web plik web.config, który jest zwykle generowany podczas publikowania aplikacji ASP.NET Core, jest zbędny dla aplikacji usługi Windows Services. Aby wyłączyć tworzenie pliku web.config , dodaj właściwość ustawioną <IsTransformWebConfigDisabled> na wartość true.

<PropertyGroup>
  <TargetFramework>netcoreapp3.0</TargetFramework>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

Wdrażanie samodzielne (SCD)

Wdrożenie samodzielne (SCD) nie polega na obecności struktury udostępnionej w systemie hosta. Środowisko uruchomieniowe i zależności aplikacji są wdrażane z aplikacją.

Identyfikator środowiska uruchomieniowego (RID) Windows znajduje się w obiekcie <PropertyGroup> zawierającym platformę docelową:

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Aby opublikować dla wielu identyfikatorów RID:

Aby uzyskać więcej informacji, zobacz Katalog identyfikatorów RID platformy .NET Core.

Konto użytkownika usługi

Aby utworzyć konto użytkownika dla usługi, użyj polecenia cmdlet New-LocalUser z administracyjnej powłoki poleceń programu PowerShell 6.

W Aktualizacja systemu Windows 10 z października 2018 (wersja 1809/kompilacja 10.0.17763) lub nowsza:

New-LocalUser -Name {SERVICE NAME}

W systemie operacyjnym Windows starszym niż Aktualizacja systemu Windows 10 z października 2018 (wersja 1809/kompilacja 10.0.17763):

powershell -Command "New-LocalUser -Name {SERVICE NAME}"

Po wyświetleniu monitu podaj silne hasło .

Jeśli parametr nie -AccountExpires zostanie dostarczony do polecenia cmdlet New-LocalUser z wygaśnięciem DateTime, konto nie wygaśnie.

Aby uzyskać więcej informacji, zobacz Microsoft.PowerShell.LocalAccounts i Konta użytkowników usługi.

Alternatywnym podejściem do zarządzania użytkownikami w przypadku korzystania z usługi Active Directory jest użycie zarządzanych kont usług. Aby uzyskać więcej informacji, zobacz Omówienie kont usług zarządzanych przez grupę.

Logowanie jako prawa do usługi

Aby ustanowić prawa logowania jako usługi dla konta użytkownika usługi:

  1. Otwórz edytor lokalnych zasad zabezpieczeń, uruchamiając polecenie secpol.msc.
  2. Rozwiń węzeł Zasady lokalne i wybierz pozycję Przypisanie praw użytkownika.
  3. Otwórz zasady Logowanie jako usługa .
  4. Wybierz pozycję Dodaj użytkownika lub grupę.
  5. Podaj nazwę obiektu (konto użytkownika) przy użyciu jednej z następujących metod:
    1. Wpisz konto użytkownika ({DOMAIN OR COMPUTER NAME\USER}) w polu nazwa obiektu i wybierz przycisk OK , aby dodać użytkownika do zasad.
    2. Wybierz pozycję Zaawansowane. Wybierz pozycję Znajdź teraz. Wybierz konto użytkownika z listy. Wybierz przycisk OK. Ponownie wybierz przycisk OK , aby dodać użytkownika do zasad.
  6. Wybierz przycisk OK lub Zastosuj , aby zaakceptować zmiany.

Tworzenie usługi Windows i zarządzanie nią

Tworzenie usługi

Użyj poleceń programu PowerShell, aby zarejestrować usługę. W administracyjnej powłoce poleceń programu PowerShell 6 wykonaj następujące polecenia:

$acl = Get-Acl "{EXE PATH}"
$aclRuleArgs = "{DOMAIN OR COMPUTER NAME\USER}", "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "{EXE PATH}"

New-Service -Name {SERVICE NAME} -BinaryPathName "{EXE FILE PATH}" -Credential "{DOMAIN OR COMPUTER NAME\USER}" -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
  • {EXE PATH}: ścieżka pliku wykonywalnego aplikacji na hoście (na przykład d:\myservice). Nie dołączaj nazwy pliku wykonywalnego aplikacji do ścieżki. Końcowy ukośnik nie jest wymagany.
  • {DOMAIN OR COMPUTER NAME\USER}: Konto użytkownika usługi (na przykład Contoso\ServiceUser).
  • {SERVICE NAME}: Nazwa usługi (na przykład MyService).
  • {EXE FILE PATH}: pełna ścieżka wykonywalna aplikacji (na przykład d:\myservice\myservice.exe). Dołącz nazwę pliku wykonywalnego z rozszerzeniem .
  • {DESCRIPTION}: Opis usługi (na przykład My sample service).
  • {DISPLAY NAME}: nazwa wyświetlana usługi (na przykład My Service).

Uruchamianie usługi

Uruchom usługę za pomocą następującego polecenia programu PowerShell 6:

Start-Service -Name {SERVICE NAME}

Uruchomienie usługi trwa kilka sekund.

Określanie stanu usługi

Aby sprawdzić stan usługi, użyj następującego polecenia programu PowerShell 6:

Get-Service -Name {SERVICE NAME}

Stan jest zgłaszany jako jedna z następujących wartości:

  • Starting
  • Running
  • Stopping
  • Stopped

Zatrzymywanie usługi

Zatrzymaj usługę za pomocą następującego polecenia programu PowerShell 6:

Stop-Service -Name {SERVICE NAME}

Usuwanie usługi

Po krótkim opóźnieniu, aby zatrzymać usługę, usuń usługę za pomocą następującego polecenia programu PowerShell 6:

Remove-Service -Name {SERVICE NAME}

Scenariusze serwera proxy i modułu równoważenia obciążenia

Usługi, które współdziałają z żądaniami z Internetu lub sieci firmowej i znajdują się za serwerem proxy lub modułem równoważenia obciążenia, mogą wymagać dodatkowej konfiguracji. Aby uzyskać więcej informacji, zobacz Konfigurowanie ASP.NET Core do pracy z serwerami proxy i modułami równoważenia obciążenia.

Konfigurowanie punktów końcowych

Domyślnie ASP.NET Core wiąże się z elementem http://localhost:5000. Skonfiguruj adres URL i port, ustawiając zmienną środowiskową ASPNETCORE_URLS .

Aby uzyskać dodatkowe metody konfiguracji adresów URL i portów, zobacz odpowiedni artykuł na serwerze:

Powyższe wskazówki obejmują obsługę punktów końcowych HTTPS. Na przykład skonfiguruj aplikację pod kątem protokołu HTTPS, gdy uwierzytelnianie jest używane z usługą Windows Service.

Uwaga

Korzystanie z certyfikatu dewelopera ASP.NET Core HTTPS w celu zabezpieczenia punktu końcowego usługi nie jest obsługiwane.

Bieżący katalog i katalog główny zawartości

Bieżący katalog roboczy zwracany przez wywołanie GetCurrentDirectory usługi Windows to folder C:\WINDOWS\system32. Folder system32 nie jest odpowiednią lokalizacją do przechowywania plików usługi (na przykład plików ustawień). Użyj jednej z poniższych metod, aby zachować zasoby i pliki ustawień usługi i uzyskiwać do nich dostęp.

Używanie elementu ContentRootPath lub ContentRootFileProvider

Użyj elementu IHostEnvironment.ContentRootPath lub ContentRootFileProvider znajdź zasoby aplikacji.

Gdy aplikacja działa jako usługa, UseWindowsService ustawia wartość ContentRootPathAppContext.BaseDirectory.

Domyślne pliki appsettings.json ustawień aplikacji i appsettings.{Environment}.json, są ładowane z katalogu głównego zawartości aplikacji przez wywołanie metody CreateDefaultBuilder podczas budowy hosta.

W przypadku innych plików ustawień załadowanych przez kod dewelopera w programie ConfigureAppConfigurationnie ma potrzeby wywoływania metody SetBasePath. W poniższym przykładzie custom_settings.json plik istnieje w katalogu głównym zawartości aplikacji i jest ładowany bez jawnego ustawienia ścieżki podstawowej:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseWindowsService()
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("custom_settings.json");
            })
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}

Nie próbuj użyć GetCurrentDirectory polecenia , aby uzyskać ścieżkę zasobu, ponieważ aplikacja usługi Windows zwraca folder C:\WINDOWS\system32 jako jego bieżący katalog.

Przechowywanie plików usługi w odpowiedniej lokalizacji na dysku

Określ ścieżkę bezwzględną przy SetBasePath użyciu elementu do IConfigurationBuilder folderu zawierającego pliki.

Rozwiązywanie problemów

Aby rozwiązać problemy z aplikacją usługi Windows Service, zobacz Rozwiązywanie problemów i debugowanie projektów ASP.NET Core.

Typowe błędy

  • Jest używana stara lub wstępna wersja programu PowerShell.
  • Zarejestrowana usługa nie używa opublikowanych danych wyjściowych aplikacji z polecenia dotnet publish . Dane wyjściowe polecenia dotnet build nie są obsługiwane w przypadku wdrażania aplikacji. Opublikowane zasoby znajdują się w jednym z następujących folderów w zależności od typu wdrożenia:
    • bin/Release/{TARGET FRAMEWORK}/publish (FDD)
    • bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
  • Usługa nie jest w stanie URUCHOMIONYm.
  • Ścieżki do zasobów używanych przez aplikację (na przykład certyfikaty) są niepoprawne. Podstawową ścieżką usługi Windows jest c:\Windows\System32.
  • Użytkownik nie ma praw logowania jako usługi .
  • Hasło użytkownika wygasło lub niepoprawnie zostało przekazane podczas wykonywania New-Service polecenia programu PowerShell.
  • Aplikacja wymaga ASP.NET Core uwierzytelniania, ale nie jest skonfigurowana pod kątem bezpiecznych połączeń (HTTPS).
  • Port adresu URL żądania jest niepoprawny lub nie jest poprawnie skonfigurowany w aplikacji.

Dzienniki zdarzeń systemu i aplikacji

Uzyskaj dostęp do dzienników zdarzeń systemu i aplikacji:

  1. Otwórz menu Start, wyszukaj Podgląd zdarzeń i wybierz aplikację Podgląd zdarzeń.
  2. W Podgląd zdarzeń otwórz węzeł Dzienniki Windows.
  3. Wybierz pozycję System, aby otworzyć dziennik zdarzeń systemu. Wybierz pozycję Aplikacja , aby otworzyć dziennik zdarzeń aplikacji.
  4. Wyszukaj błędy skojarzone z aplikacją, która kończy się niepowodzeniem.

Uruchamianie aplikacji w wierszu polecenia

Wiele błędów uruchamiania nie generuje przydatnych informacji w dziennikach zdarzeń. Przyczynę niektórych błędów można znaleźć, uruchamiając aplikację w wierszu polecenia w systemie hostingu. Aby zarejestrować dodatkowe szczegóły z aplikacji, obniżyć poziom dziennika lub uruchomić aplikację w środowisku deweloperów.

Wyczyść pamięci podręczne pakietów

Działająca aplikacja może zakończyć się niepowodzeniem natychmiast po uaktualnieniu zestawu .NET Core SDK na komputerze deweloperskim lub zmianie wersji pakietów w aplikacji. W niektórych przypadkach niespójne pakiety mogą spowodować przerwanie aplikacji podczas wykonywania głównych uaktualnień. Większość z tych problemów można rozwiązać, wykonując następujące instrukcje:

  1. Usuń pojemnik i foldery obj .

  2. Wyczyść pamięć podręczną pakietu, wykonując polecenie dotnet nuget locals all --clear z powłoki poleceń.

    Czyszczenie pamięci podręcznych pakietów można również wykonać za pomocą narzędzia nuget.exe i wykonania polecenia nuget locals all -clear. nuget.exe nie jest zainstalowana w pakiecie z systemem operacyjnym Windows desktop i musi być uzyskiwana oddzielnie od witryny internetowej NuGet.

  3. Przywróć i skompiluj projekt.

  4. Usuń wszystkie pliki w folderze wdrożenia na serwerze przed ponownym wdrożeniem aplikacji.

Powolne lub nieodpowiedzialne aplikacje

Zrzut awaryjny to migawka pamięci systemu i może pomóc w ustaleniu przyczyny awarii aplikacji, awarii uruchamiania lub powolnej aplikacji.

Aplikacja ulega awarii lub napotyka wyjątek

Uzyskaj i przeanalizuj zrzut z Raportowanie błędów systemu Windows (Raportowanie błędów systemu Windows):

  1. Utwórz folder do przechowywania plików zrzutu awaryjnego pod adresem c:\dumps.

  2. Uruchom skrypt EnableDumps programu PowerShell z nazwą wykonywalną aplikacji:

    .\EnableDumps {APPLICATION EXE} c:\dumps
    
  3. Uruchom aplikację w warunkach, które powodują wystąpienie awarii.

  4. Po wystąpieniu awarii uruchom skrypt DisableDumps programu PowerShell:

    .\DisableDumps {APPLICATION EXE}
    

Po zakończeniu awarii aplikacji i zakończeniu zbierania zrzutów aplikacja może zakończyć działanie normalnie. Skrypt programu PowerShell konfiguruje Raportowanie błędów systemu Windows do zbierania maksymalnie pięciu zrzutów na aplikację.

Ostrzeżenie

Zrzuty awaryjne mogą zająć dużą ilość miejsca na dysku (maksymalnie kilka gigabajtów).

Aplikacja nie odpowiada, kończy się niepowodzeniem podczas uruchamiania lub działa normalnie

Gdy aplikacja zawiesza się (przestaje odpowiadać, ale nie ulega awarii), kończy się niepowodzeniem podczas uruchamiania lub działa normalnie, zobacz Pliki zrzutu w trybie użytkownika: Wybieranie najlepszego narzędzia w celu wybrania odpowiedniego narzędzia do utworzenia zrzutu.

Analizowanie zrzutu

Zrzut można analizować przy użyciu kilku metod. Aby uzyskać więcej informacji, zobacz Analizowanie pliku zrzutu User-Mode.

Dodatkowe zasoby