将ASP.NET核心应用程序作为Windows服务运行

我们现在可以以最小的努力将ASP.NET Core应用程序作为Windows服务运行。这篇博客文章介绍了这个过程是如何完成的。

ASP.NET Core 2.1为Windows服务引入了一个新的应用程序主机。我们现在可以以最小的努力将ASP.NET Core应用程序作为Windows服务运行。这篇博客文章介绍了它是如何完成的以及如何在ASP.NET Core上构建和运行Windows服务,而不需要肮脏的黑客攻击。

创建默认的Web应用程序

我们从新的默认ASP.NET Core 2.1 Web应用程序开始。

将ASP.NET核心应用程序作为Windows服务运行

我没有配置HTTPS,因为这是一个示例应用程序,它没有任何重要意义。

默认情况下,这个 Program类看起来像这样。

public class Program

{

public static void Main(string[] args)

{

CreateWebHostBuilder(args).Build().Run();

}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

WebHost.CreateDefaultBuilder(args)

.UseStartup();

}

现在我们有了默认的应用程序,现在是时候关注Windows服务了。

将ASP.NET核心应用程序作为Windows服务运行

将应用程序作为Windows服务运行需要一些努力,然后才能打开浏览器并在服务中查看它。首先,我们必须为我们的应用程序指定一个运行时,因为ASP.NET Core还支持Windows服务不运行的操作系统和体系结构。为此,我们必须修改项目文件。

netcoreapp2.1

win7-x64

接下来,添加对NuGet包Microsoft.AspNetCore.Hosting.WindowsServices的引用。该软件包具有运行ASP.NET Core应用程序作为Windows服务所需的所有功能。

NB!对我而言,Microsoft.AspNetCore.Hosting.WindowsServices的最新版本2.1.1与ASP.NET Core 2.1.0发生冲突,我改为使用2.1.0版。

我们也必须修改Main() 这个Program 类的 方法 。以最简单的形式,该 Main() 方法看起来像这样。

public static void Main(string[] args)

{

var pathToExe = Process.GetCurrentProcess().MainModule.FileName;

var pathToContentRoot = Path.GetDirectoryName(pathToExe);

var host = WebHost.CreateDefaultBuilder(args)

.UseContentRoot(pathToContentRoot)

.UseStartup()

.Build();

host.RunAsService();

}

我们现在要做的就是发布我们的应用程序,将其注册为Windows服务并启动服务。

将应用程序作为服务运行或在控制台上运行

那些曾经构建过Windows服务的人非常清楚,在构建服务之后,必须部署新版本的服务,附加一个调试器等,服务的调试可能会成为特定解剖区域的痛苦。有简单的解决方法 - 我们将Windows服务作为一个控制台应用程序来运行,它很容易在Visual Studio的调试器上运行。

我们也可以将相同的技巧应用于作为Windows服务运行的ASP.NET Core应用程序。

public static void Main(string[] args)

{

var isService = !(Debugger.IsAttached || args.Contains("--console"));

var pathToContentRoot = Directory.GetCurrentDirectory();

var webHostArgs = args.Where(arg => arg != "--console").ToArray();

if (isService)

{

var pathToExe = Process.GetCurrentProcess().MainModule.FileName;

pathToContentRoot = Path.GetDirectoryName(pathToExe);

}

var host = WebHost.CreateDefaultBuilder(webHostArgs)

.UseContentRoot(pathToContentRoot)

.UseStartup()

.Build();

if (isService)

{

host.RunAsService();

}

else

{

host.Run();

}

}

显示的代码可能看起来有点棘手。这里是我的解释:

  • 要从Visual Studio在控制台上运行应用程序,我们控制是否连接了调试器。如果我们想在Visual Studio之外将应用程序作为控制台应用程序运行,那么我们可以使用 -console参数。
  • 当应用程序作为Web服务器下的Web应用程序运行时,我们必须使用当前目录作为内容根目录。但是当应用程序作为服务运行时,我们需要一个可执行路径作为内容根。
  • 我们删除 -console 参数,因为ASP.NET Core期望所有参数都是名称 - 值对。

现在尝试从Visual Studio运行应用程序。它从一个普通的Web应用程序开始。

使应用程序作为Windows服务运行

为了使应用程序作为Windows服务运行,我们需要一些额外的步骤。

  1. 将应用程序发布到某个文件夹。
  2. 以管理权限打开命令行。
  3. 使用t命令将应用程序注册为Windows服务(“binPath =”为必填项后的空格) 。
  4. 开始服务:sc start AspNetWindowsService。
  5. 服务启动后,打开浏览器并导航到http:// localhost:5000以查看运行的Web应用程序。

在发布新版本的服务之前,必须停止当前运行的实例。为此,我们可以使用该命令 sc stop AspNetWindowsService。要删除该服务,请运行以下命令: sc delete AspNetWindowsService。

结束

使用新的Microsoft.AspNetCore.Hosting.WindowsServices NuGet软件包,可以轻松地将ASP.NET Core应用程序作为Windows服务运行。我们必须稍微修改一下项目文件并制作应用程序的 Main() 方法,以便了解应用程序作为服务或控制台应用程序运行。使用这个技巧,我们能够在Visual Studio上构建一个Web应用程序,并将其作为典型的Web应用程序运行。将Web应用程序作为Windows服务运行的负担很小。


分享到:


相關文章: