Hébergement ASP.NET de Base en tant que service Windows
Comme je l'obtenir dans la RC2, il ya un soutien pour l'hébergement des applications dans les Services Windows. J'ai essayé de le tester sur un simple projet d'api web (à l'aide .NET Framework 4.6.1).
Voici mon Programme.cs code:
using System;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.WindowsServices;
namespace WebApplication4
{
public class Program : ServiceBase
{
public static void Main(string[] args)
{
if (args.Contains("--windows-service"))
{
Run(new Program());
return;
}
var program = new Program();
program.OnStart(null);
Console.ReadLine();
program.OnStop();
}
protected override void OnStart(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.Build();
host.RunAsService();
}
protected override void OnStop() {}
}
}
Tous les autres trucs sont pour l'essentiel de l' .NET de Base du modèle (bien que j'ai changé de cadre à net461 et ajouté certaines dépendances du projet.json).
Après la publication avec dotnet publish
et la création d'un Service Windows avec sc create
je peux réussir à démarrer mon service, mais je ne peux pas atteindre tout de mon contrôleurs (ports ne sont pas listeting). Je suppose que je suis en train de faire quelque chose de mal.
Donc je suppose que la question principale est de savoir comment faire de l'auto hébergé web de l'api et de l'exécuter en tant que Service Windows. Tous ont trouvé des solutions ne fonctionnent pas après la RC2 de mise à jour.
- Je ne comprends pas très bien ce qu'il se passe, mais votre code fonctionne très bien lorsque je l'exécute en tant que service Windows, tant que je ne passe pas
--windows-service
à elle. - En fait le ASP.NET l'équipe prévoit déjà que la classe. Il y a même un NuGet pour elle. Il suffit de l'essayer, mais ne semble pas être facile ainsi: github.com/aspnet/Home/issues/1386
- Je vais avoir le même problème. Lorsque vous exécutez à partir de la ligne de commande (c'est à dire sans --windows-service), il fonctionne très bien. La création du service, fonctionne très bien (par exemple, "sc.exe ABC -binPath= "<chemin d'accès de fichier exe> --de la fenêtre de service") et de commencer le service de Services est très bien et montre que c'est de la Course, mais en essayant d'accéder au service via localhost:5000 ne fonctionne pas. Toutes les suggestions seraient appréciées.
- Bonjour, comment, où vous en mesure d'ajouter une référence à System.ServiceProcess? Je ne peux pas ajouter la référence à mon netcoreapp1.0 projet ciblé
System.ServiceProcess
n'est pas disponible dansnetcoreapp1.0
(CoreCLR) pour le moment. Comme mentionné précédemment, vous aurez pour objectif plein cadre, par exemple,net461
puis de référenceframeworkAssemblies
.- Avez-vous été capable de faire ce travail @maria-p?
Vous devez vous connecter pour publier un commentaire.
Vous avez deux options ici - utilisation de Microsoft WebHostService classe, hériter WebHostService ou écrire votre propre. La raison de ce dernier étant qu'à l'aide de Microsoft de la mise en œuvre, on ne peut pas écrire une extension générique de la méthode avec un paramètre de type hériter WebHostService étant donné que cette classe ne contient pas de constructeur sans paramètre, nous ne pouvons pas accéder au service locator.
À L'Aide De WebHostService
Dans cet exemple, je vais créer une Application Console qui utilise Microsoft.DotNet.Web.les objectifs, les résultats d'une .exe et fonctionne comme une application MVC (Vues, Contrôleurs, etc). Je suppose que la création de l'Application de la Console, changer les cibles dans le .xproj et de modifier le projet.json pour avoir le bon d'options de publication et de copier les points de Vue, des Contrôleurs et des webroot de la norme .NET web de Base modèle d'application - est trivial.
Maintenant l'essentiel:
Obtenir cette paquet et assurez-vous que votre cadre d'un projet.fichier json est net451 (ou plus récent)
Assurez-vous que le contenu de la racine du point d'entrée est correctement configuré pour la publier le répertoire de l'application .exe fichier et que le RunAsService() extension de la méthode est appelée. E. g:
L' .exe peut facilement être installé à l'aide de la commande suivante
Une fois que le service est démarré, l'application web est hébergé et a trouvé et rend son point de Vue.
Hériter WebHostService
Un avantage majeur de cette approche est qu'il nous permet de remplacer la OnStopping, OnStarting et OnStarted méthodes.
Supposons que la suite est notre coutume de classe qui hérite WebHostService
Suivant les étapes ci-dessus, nous devons écrire notre propre méthode d'extension qui exécute l'hôte à l'aide de notre classe personnalisée:
La seule ligne qui reste à être modifié à partir de l'exemple précédent du point d'entrée est le else à la fin, il a appeler la bonne méthode d'extension
Enfin, l'installation du service à l'aide de la même procédure que ci-dessus.
.UseContentRoot(directoryPath)
devrait être.UseContentRoot(Directory.GetCurrentDirectory())
si wwwroot est nécessairebinpath
impossible d'avoir des espaces autour de la=
. Il est également documenté que sans la capitalisation, mais ce n'est pas nécessaire.Si c'est bon pour courir sur le plein .NET Framework, les réponses précédentes sont suffisantes (Héritant de
ServiceBase
ou à l'aide de MicrosoftWebHostService
).Si, toutefois, vous voulez exécuter sur .NET de Base seulement (par exemple, sur windows nano serveur, binaire unique qui fonctionne sur linux comme normal de l'application et en tant que service sous windows, ou le besoin de courir côte à côte avec des applications sur un vieux .NET Framework version de sorte que vous ne pouvez pas mettre à jour le cadre du système), vous auriez à faire des appels d'API de windows vous-même via P/Invoque. Depuis que j'ai eu à le faire, j'ai créé un la bibliothèque qui fait exactement cela.
Il y a un exemple disponible et qu'il est également en mesure d'installer lui-même lorsqu'il est exécuté avec des privilèges d'administration (par exemple,
dotnet MyService.dll --register-as-service
).Vous avez besoin de faire référence à
Microsoft.AspNetCore.Hosting
etMicrosoft.AspNetCore.Hosting.WindowsServices
et utiliser ce code dans votre Démarrage de classe pour le rendre exécutable en tant que service windows:Ensuite, vous devez ajouter une méthode d'extension pour
IWebHost.RunAsService
pour envelopper votre propreWebHostService
classe avecOnStopping
etOnStarting
des gestionnaires d'événement:Ce post Comment héberger votre ASP.NET de Base dans un Service Windows et commentaires couvrent les détails.
Mise à JOUR (voir plus de détails dans Résumé rapide de ce qui est nouveau dans ASP.NET Core 2.0):
Dans
ASP.NET Core 1.1
que nous avions quelque chose comme ceci:Dans
ASP.NET Core 2.0
, il ressemble à ceci:WebHost
" dans .Net Core 2.0. Pouvez-vous svp m'aider sur ce point ?J'ai trouvé ce sujet alors que la recherche d'une solution à un problème similaire. Fini par mettre en place quelque chose qui fonctionne à peu près comme très (très) simplifiée Topshelf. Vous pouvez facilement exécuter en tant que console et/ou d'installer, de désinstaller et donc, l'un en tant que service. Je pense que ça peut être assez utile pour quelqu'un. Vous trouverez le code ici : https://github.com/PeterKottas/DotNetCore.WindowsService et il n'y a nuget ici https://www.nuget.org/packages/PeterKottas.DotNetCore.WindowsService/ . Enjoy 🙂
Les Services Windows peuvent être facilement créés avec Visual Studio 2017. Vous aurez besoin de déplacer votre .NET code de Base d'une bibliothèque de classes qui cible NetStandard qui peut ensuite être référencé. Votre projet de Service Windows aura pour cible le plein .NET Framework, mais peut faire référence à votre bibliothèque partagée.
En mettant tout votre code dans la bibliothèque de classe, vous devrez la portabilité entre le Service Windows et non Windows apps.
Avec VS 2015, vous ne pouviez pas faire un projet de Service Windows et une référence .NET de Base xproj. Visual Studio 2017 résout qu'une fois que vous convertissez tous vos projets de csproj.
Ce blog promenades à travers cela plus en détail: Comment les Créer .NET de Base les Services Windows Avec Visual Studio 2017
À l'aide de la dernière VS2015 mise à Jour 2 ASP.NET de Base de l'Application Web (.NET Framework) modèle et avec les mods de Programme.cs comme ci-dessous, il fonctionne correctement lorsqu'il est exécuté en tant que service, autonome et dans VS. Notez que le chemin d'accès au répertoire contenant wwwroot doit être définie lors de l'exécution en tant que service.
Jusqu'à présent, j'aime beaucoup ce modèle et le modèle. Peut développer MVC6 code comme d'habitude dans Visual Studio, puis il se déploie à proprement en tant que service. En fait, j'ai remarqué que lors du déploiement d'une instance locale du service pour les essais qu'il n'est pas nécessaire de supprimer/créer un service à l'aide de sc.exe. Juste arrêter le service, de publier le code et redémarrez le service et il va ramasser les nouveaux changements.
RunAsService
surIWebHost
- où est-ce en venir?Mis à jour pour ce que j'utilise .netcore 2.1, en utilisant autant de modèle de stock que possible, ce qui comprend la lecture de la configuration de la appsettings.json, commande args, hôte de filtrage, etc, tel que mis en œuvre à l'intérieur de l'aide des méthodes de l' .netcore de l'équipe. Beaucoup de ces paramètres sont donc contrôlés via des fichiers de configuration ou de commande args. vérifiez la documentation de microsoft sur ce qu'il modèle de stock et comment pour remplacer les paramètres.
Veuillez noter que j'ai vu le service ne pas démarrer si vous définissez un point de terminaison avec https et le défaut de certificat de développement. C'est peut-être simplement une question de la spécification d'un pfx via la configuration. Si quelqu'un veut l'améliorer sur ce point, n'hésitez pas à le faire.
de toute façon, ici, c'est le modèle de stock code que j'utilise dans le programme.cs