zoukankan      html  css  js  c++  java
  • ASP.NET Core Web程序托管到Windows 服务

    前言

    .NET Core 3.1和WorkerServices构建Windows服务 我们也看到了,如何将workerservices构建成服务,那么本篇文章我们再来看看如何将web应用程序托管到我们的服务中.

    将WEB应用作为服务运行

    我们需要将我们的WEB应用程序编译成exe文件,在ASP.NETCore中其实这是一个很简单的过程,我们只需要修改.csproj即可。正如下面代码片段

    
    <Project Sdk="Microsoft.NET.Sdk.Web">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <OutputType>Exe</OutputType>
      </PropertyGroup>
    </Project>
    
    
    

    我们只需要添加OutputType即可.

    接着来我们需要安装Microsoft.Extensions.Hosting.WindowsServices到我们的WEB应用程序中,如下所示:

    
    Install-Package Microsoft.Extensions.Hosting.WindowsServices
    
    

    现在我们需要在Program.cs中的CreateDefaultBuilder方法中进行扩展UseWindowsService

    
        public class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    }).UseWindowsService();
        }
    

    上述代码中我们已经操作完了....

    部署服务

    我们还需要做的是部署到我们的服务中.

    以管理员身份打开命令提示符,然后在项目文件夹中运行以下命令以发布项目:

    dotnet publish -c Release
    

    接下来,我们可以使用标准Windows服务命令将exe作为服务安装。因此,将命令提示符移动到输出文件夹(可能沿着myprojectinRelease etcoreapp3.1publish)。并运行类似的内容以作为服务安装:

    sc create ASPNETCoreWindowsService binPath=ASPNETCoreWindowsService.exe
    

    当然我们也可以停止和删除该服务

    sc.exe stop ASPNETCoreWindowsService 
    sc.exe delete ASPNETCoreWindowsService 
    

    独立部署

    将Web App作为Windows服务运行的全部原因是,我们不必在计算机上安装其他工具。但这只有在我们进行所谓的独立部署时才有效。这意味着我们将应用程序所需的一切部署在发布文件夹中,而不必在目标计算机上安装.NET Core运行时。

    我们需要做的就是运行我们的dotnet release命令,其中包含一些额外的标志:

    dotnet publish -c Release -r win-x64 --self-contained
    

    这告诉.NET Core SDK我们要以独立形式发布,并且适用于Windows。

    您的输出路径将从binRelease etcoreapp3.0publish 更改为inRelease netcoreapp3.0win-x64publish

    您还将注意到此新输出目录中的大量文件以及该文件夹的一般大小。但是,考虑到这一点,是的,我们正在部署整个运行时,因此它应该很大。

    Content Root

    我快速浏览了UseWindowsService的调用在此处的实际源代码。我注意到的是,它专门为在Windows Service下运行的内容设置了根目录。我想知道如果以Windows服务运行时从应用程序内的磁盘读取本地文件怎么办?通常我只会写类似:

    File.ReadAllText("myfile.json");
    

    但是……显然,在WindowsService上下文中运行时有一些特殊之处。所以我尝试了一下,我的程序异常了。我不得不检查机器上的事件查看器,发现:

    Exception Info: System.IO.FileNotFoundException: Could not find file 'C:WINDOWSsystem32myfile.json'.

    因此,当作为Windows服务运行时,我的应用程序的"根"认为它位于System32内。再次查看Microsoft的源代码可以找到解决方案。我可以简单地使用它们设置内容根目录的相同方法,以从正确的位置加载我的文件:

    
    File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "myfile.json"));
    

    Reference

    https://github.com/hueifeng/BlogSample/tree/master/src/ASPNETCoreWindowsService

    https://dotnetcoretutorials.com/2019/12/21/hosting-an-asp-net-core-web-app-as-a-windows-service-in-net-core-3/

  • 相关阅读:
    android listview 圆角的实现方案,模仿Iphone的UITableView
    在android编程中插入背景图片
    iOS开发UI篇—UIPickerView控件简单介绍
    iOS开发UI篇章 15-项目中的常见文件
    iOS开发UI篇章之通知中心(NSNotificationCenter)
    iOS开发UI篇章之应用管理的九宫格坐标计算
    iOS开发UI篇章之-Button基础
    Xcode-Run和快捷键
    Css基础-介绍及语法
    CSDN首页> 移动开发 直接拿来用!最火的Android开源项目(完结篇)
  • 原文地址:https://www.cnblogs.com/yyfh/p/12179818.html
Copyright © 2011-2022 走看看