c# - app - windows service.net core




.Net Core 2.0 Windows Service (5)

Come Microsoft ha rilasciato Microsoft.Windows.Compatibility, vorrei usarlo, poiché sembra essere il migliore per un uso futuro.

Un semplice esempio di servizio di autoinstallazione è qui https://github.com/janantos/service_core

Sto cercando di creare un servizio di Windows in. Net Core 2.0 ma ho sbattuto la testa contro il muro per un giorno intero e senza alcun progresso. Tutto sembra utilizzare Core 1.0 / 1.1 anche la documentazione di Microsoft:

Ospita un'app di ASP.NET Core in un servizio di Windows

TopShelf non supporta anche 2.0, per quello che ho visto.

Ho visto alcune strane soluzioni che inseriscono tutto il codice in una libreria di classi standard .Net e poi usano un'applicazione .Net Framework per ospitare il servizio di Windows, ma questo non sembra elegante ai miei occhi e sto cercando di ottenere liberarsi completamente di .NET Framework.

È quello che voglio fare anche in questo momento? Mi manca qualcosa di veramente semplice?


Forse si tratta di una completa esclusione, ma ricorda che con un supporto docker maggiore, potresti essere in grado di creare un servizio che viene eseguito all'interno di un contenitore. A quel punto, sarebbe ancora. Netto core (2.0), ma in esecuzione su Windows Box. Inoltre, è possibile distribuire praticamente ovunque in futuro.

Con la maturazione del core dotnet, questa è una soluzione migliore e migliore, presupponendo che il servizio non richieda risorse locali per l'host.


Ora è possibile scrivere un servizio Windows in .NET Core 2.0 senza librerie di terze parti, grazie alla versione di Windows Compatibility Pack (al momento della scrittura, ancora in prerelease). Come avverte la pagina stessa:

Ma prima di iniziare il porting, dovresti capire cosa vuoi ottenere con la migrazione. Il semplice porting su .NET Core perché è una nuova implementazione .NET non è un buon motivo (a meno che tu non sia un vero fan).

In particolare, è possibile che sia possibile creare un servizio Windows in .NET Core, ma non si otterrà la compatibilità multipiattaforma, poiché gli assembly per piattaforme diverse da Windows generano solo PlatformNotSupportedException se si tenta di utilizzare il codice di servizio . È possibile aggirare questo problema (utilizzando RuntimeInformation.IsOSPlatform , ad esempio), ma questa è un'altra domanda.

Inoltre, le librerie di terze parti possono ancora offrire un'interfaccia migliore per quanto riguarda l'installazione del servizio: al momento della scrittura, la versione corrente del pacchetto di compatibilità ( 2.0.0-preview1-26216-02 ) non supporta System.Configuration.Install namespace, quindi l'approccio predefinito con una classe ServiceProcessInstaller e installutil non funzionerà. Maggiori informazioni in seguito.

Detto questo, supponiamo di aver creato un nuovissimo servizio Windows ( Service1 ) dal modello del progetto (non strettamente necessario in quanto non contiene nulla di interessante, se non una classe che eredita da ServiceBase ). Tutto ciò che devi fare per farlo costruire su .NET Core 2.0 è quello di modificare e sostituire il .csproj con il nuovo formato:

<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp20</TargetFramework>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.0-*" />
  </ItemGroup>
</Project>

E quindi elimina properties\AssemblyInfo.cs poiché non è più necessario e entrerà in conflitto con le informazioni sulla versione nel progetto stesso.

Se hai già un servizio e ha dipendenze, la conversione potrebbe essere più complicata. Vedi here

Ora dovresti essere in grado di eseguire dotnet publish e ottenere un eseguibile. Come accennato, non è possibile utilizzare la classe ServiceProcessInstaller per installare il servizio, quindi sarà necessario farlo manualmente

  • registrare la fonte di eventi utilizzata dal servizio;
  • creare il servizio effettivo.

Questo può essere fatto con alcuni PowerShell. Da un prompt con privilegi elevati nella posizione che contiene il file eseguibile pubblicato:

$messageResourceFile = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\EventLogMessages.dll"
New-EventLog -LogName Application -Source Service1 -MessageResourceFile $messageResourceFile
sc.exe create Service1 binPath= (Resolve-Path .\WindowsService1.exe)

Questo non è l'ideale in diversi modi: questo hardcodifica il percorso del file di risorse del messaggio (dovremmo davvero stabilire dove si trova dal file eseguibile e dai percorsi di runtime nel registro) e codifica il nome del servizio e l'eseguibile nome. Potresti voler dare al tuo progetto le proprie capacità di installazione eseguendo alcune analisi da riga di comando in Program.cs , o usare una delle librerie citate nella risposta di Cocowalla .


Per ospitare API Web .NET Core 2.0 come servizio Windows. Ho seguito questa guida Host ASP.NET Core in un servizio di Windows . La parte dei Prerequisiti non è chiara per me. Dopo alcuni errori, ecco cosa ho fatto: codice sorgente

  1. Creare un'applicazione Web principale ASP.NET
  2. Scegli API
  3. Modifica il file .csproj, è necessario modificare il framework di destinazione da netcoreapp2.0 a net461 , elencare esplicitamente tutti i riferimenti del pacchetto piuttosto che utilizzare Microsoft.AspNetCore.All , come segue

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

  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
    <!--<TargetFramework>netcoreapp2.0</TargetFramework>-->
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <!--<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />-->
    <PackageReference Include="Microsoft.AspNetCore" Version="2.0.2" />
    <PackageReference Include="Microsoft.AspNetCore.Hosting.WindowsServices" Version="2.0.2" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.3" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.2" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.0.1" />
    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.0.2" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3" />
  </ItemGroup>

</Project>

  1. power shell [soluzione-cartella] dotnet publish -o "[publish-folder]"
  2. power shell [soluzione-cartella] sc.exe crea CoreApi binpath = "[publish-folder] \ CoreApiHostedAsWindowsService.exe"
  3. power shell [soluzione-cartella] sc.exe avvia CoreApi
  4. visita predefinita power api shell [soluzione-cartella] Invoke-WebRequest http://localhost:5000/api/values

Un modo semplice per creare un servizio .NET Core di Windows è utilizzare la DotNetCore.WindowsService Peter Kottas.

Il pacchetto NuGet è PeterKottas.DotNetCore.WindowsService . Per installarlo utilizzando la console di Gestione pacchetti di Visual Studio, è sufficiente eseguire

Install-Package PeterKottas.DotNetCore.WindowsService

Ci sono anche buone note su come iniziare .





asp.net-core