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作为服务安装。因此,将命令提示符移动到输出文件夹(可能沿着myproject\bin\Release\netcoreapp3.1\publish)。并运行类似的内容以作为服务安装:

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。

您的输出路径将从bin\Release\netcoreapp3.0\publish 更改为\bin\Release netcoreapp3.0\win-x64\publish

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

Content Root

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

File.ReadAllText("myfile.json");

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

Exception Info: System.IO.FileNotFoundException: Could not find file 'C:\WINDOWS\system32\myfile.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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运行wordcount.java_运行hadoop wordcount程序

我正在通过以下michael-noll教程学习hadoop . 当我试图通过运行 hadoop jar hadoop-examples-1.2.1.jar wordcount tmp/Files tmp/Output 运行wordcount示例时&#xff0c;我收到以下错误&#xff1a;13/11/10 18:09:42 INFO ipc.Client&#xff1a;重试连接到服务器&#xff1…

EntityFramework Core动态加载模型,我们要知道些什么呢?

这篇文章源于一位问我的童鞋&#xff1a;在EntityFramework Core中如何动态加载模型呢&#xff1f;在学习EntityFramwork时关于这个问题已有对应童鞋给出答案&#xff0c;故没有过多研究&#xff0c;虽然最后解决了这位童鞋提出的问题&#xff0c;但是当我再次深入研究时&#…

C++多态的基本语法与原理剖析

多态分为两类 1.静态多态&#xff1a;函数重载和运算符重载属于静态多态&#xff0c;复用函数名 2.动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 1.静态多态的函数地址早绑定&#xff0c;编译阶段确定函数地址 2.多态多态的函数地址…

从零开始开发 VS Code 插件之 Translator Helper

本文目录Translator Helper 介绍开发概述创建第一个VS Code Extension需求分析操作文本调用Google Translation API实现核心功能配置命令插件配置测试插件打包插件发布插件CI/CDIcon及README小结Translator Helper 介绍 微软 Docs 网站上线之后&#xff0c;我发现很多中文内容是…

java printf 版本_java – PrintStream类型中的printf(String,Object ...

为什么通过简单调用printf会出现以下编译错误&#xff1f;我的代码&#xff1a;import java.util.Scanner;public class TestCodeBankAccInputs{public static void main(String[] args){String displayName "Bank of America Checking";int balance 100;System.ou…

C++string容器-构造函数

本质&#xff1a; string是C风格的字符串&#xff0c;而string本质上是一个类 string和char区别&#xff1a; 1.char是一个指针 2.string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器 string构造函数原型&#xff1a; 1…

【实战 Ids4】║ 又一个项目迁移完成(MVC)

迎周一&#xff0c;腊月十九&#xff0c;小年倒计时新年还有两周时间就要到了&#xff0c;学习可不能停&#xff0c;这几天一直在加班调休&#xff0c;周末也如此&#xff0c;不过也是趁着半夜凌晨的时间&#xff0c;继续迁移我的项目到IdentityServer4统一认证授权中心Blog.Id…

C++string容器-赋值操作

功能描述&#xff1a; 给string字符串进行赋值 代码如下&#xff1a; #include <iostream> using namespace std; #include <cstring>void test01() {string str1;str1 "hello world";cout << "str1 " << str1 << endl;…

C++生成随机数

C中生成随机数常用这两个函数&#xff1a; rand()和srand() rand()函数&#xff0c;生成一个范围在[0,RAND_MAX]的随机数&#xff0c;RAND_MAX的值为32767 其中RAND_MAX定义在cstdlib头文件中。 #include <iostream> using namespace std; #include <cstdlib>in…

JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)

package test;/*** Synchronized 版本解决生产者消费者* wait() / notify()方法*/import java.util.LinkedList;import java.util.Queue;public class ProducerAndConsumerForSynchronized {// 1. 先定义最大生产长度private final int MAX_SIZE 10;// 2.定义储存队列private …

为什么说云原生会成为未来企业技术变迁的趋势

云原生是当下的热点话题&#xff0c;但是很多人对云原生有很多误解&#xff0c;特别是传统产业物联网或工控、物联网行业对云原生显得"后知后觉"。与其在这里说是预测&#xff0c;不如说是现在进行时&#xff0c;只是由于传统产业本身的技术包袱和组织个人认识程度差…

C++vector容器-构造函数

vector数据结构和数组非常相似&#xff0c;也称为单端数组&#xff0c;在数组的尾段可以做插入&#xff0c;删除操作 vector不同于普通数组&#xff0c;vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0c;而是找更大的内存空间&#xff0c;然…

java对象类型转换分为_java-如何将类对象转换为通用对象类型?

我正在研究一种使用NamedParameterJdbcTemplate从MySQL数据库获取一些数据的方法. listCurrentRecords应该从数据库返回Customer,Product和SalesOrder的对象类型列表. objectType是从在方法(1 || 2 || 3)内传递的参数定义的,并且在类中更早地定义为public变量.public static fi…

BeetleX网关之请求聚合

在网关服务中请求聚合是允许把多个请求打包成一个响应给请求方&#xff0c;这样不仅可以节省请求方的请求数量&#xff0c;还可以根据需求的情况整合不同业务数据响应请求。BeetleX.Bumblebee虽然并没有内置这一功能&#xff0c;但可以通过扩展的形式来支持请求聚合&#xff0c…

C++vector容器-赋值操作

vector赋值操作 功能描述&#xff1a; 给vector容器进行赋值 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <vector> //vector赋值操作void printVector(vector<int> &v) {for (vector<int >…

java 计算i 出现的次数_JAVA算法:按照给定的段落统计单词出现次数(JAVA代码)...

https://blog.csdn.net/seagal890/article/details/92067644JAVA算法&#xff1a;按照给定的段落统计单词出现次数(JAVA代码)写一个 JAVA程序以统计一个文本文件 words.txt 中每个单词出现的频率。为了简单起见&#xff0c;你可以假设&#xff1a;words.txt只包括小写字母和 …

EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱

上一节我们针对最开始抛出的异常只是进行了浅尝辄止的解析&#xff0c;是不是有点意犹未尽的感觉&#xff0c;是的&#xff0c;我也有这种感觉&#xff0c;看到这里相信您和我会有一些疑惑&#xff0c;要是我们接下来通过注解、Fluent APi、DbSet分别对表名进行如下设置&#x…

C++vector容器-容量和大小

vector容量和大小 功能描述&#xff1a; 对vector容器的容量和大小操作 函数原型&#xff1a; 代码如下&#xff1a; #include <iostream> using namespace std; #include <vector> //vector容器的容量和大小操作void printVector(vector<int > &v) {…

openresty+mysql+乱码_openresty记录响应body乱码问题

问题背景最近新上了一个功能&#xff0c;openresty通过syslog记录请求日志&#xff0c;然后由logstash推送至ES。测试上线时未发现这个问题&#xff0c;在日常查看日志的过程中&#xff0c;发现logstash推送有错误日志&#xff0c;错误内容为&#xff1a;Error parsing json&am…

【Azure学习.01】先从账号注册开始

本文部分内容配套视频&#xff1a;https://www.bilibili.com/video/av82898957马上要放假了&#xff0c;决定在家里简单了解一下Azure云服务&#xff0c;虽然公司其他部分用到了这个Azure&#xff0c;但是我还是没有接触到&#xff0c;只是听说很贵&#xff0c;好几千每天&…