Kestrel封装在WindowService中(.net5,.net6,.net7三个版本的介绍)

news2024/11/30 2:42:50

Kestrel封装在WindowServer中

  • 背景
  • 关于WindowsServer
  • 开发服务
    • .NET5版本
      • 建项目
      • 添加Controller
      • 添加引用
      • 修改Startup.cs
      • 修改Program.cs
      • 配置Kestrel监听
      • 发布程序
      • 通过命令行创建服务
        • 关于SC命令
      • 启动服务查看效果
        • 测试效果
    • ==.NET6==
      • 错误1
      • 解决办法:
      • 错误2
      • 运行效果如下图
    • .NET7版本(和6版本一样就可以)
  • 源码下载

背景

在一些开发过程中,会在局域网内搭建webapi服务作为移动端的服务接口使用,但是每次实施人员要到客户现场安装iis等工具,还有一些web的配置,非常繁琐,所以想着把webapi封装到WindowService中,可以通过自定义的安装程序进行一键部署,岂不美哉!
这篇文章主要是记录如何将Kestrel的服务封装在WindowService中

关于WindowsServer

请参考如下这篇文章

.netcore worker service (辅助角色服务) 的上手入门,包含linux和windows服务部署

开发服务

之前做过.net5版本的处理,觉得挺简单的,但是到.net6的时候遇到了一些问题,所以下面都会记录

.NET5版本

建项目

新建一个webapi项目,如下图
在这里插入图片描述

添加Controller

在这里插入图片描述

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace WebApiNet_v5.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        [HttpGet]
        public string Get(string name)
        {
            return $"Hello {name}";
        }
    }
}

添加引用

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

  <PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
  <!-- 千万不要引用7.0版本,不兼容 -->
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
  </ItemGroup>

</Project>

修改Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApiNet_v5
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApiNet_v5", Version = "v1" });
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
        //这里注释一下是为了在发布以后还可以查看Swagger
            //if (env.IsDevelopment())
            //{
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApiNet_v5 v1"));
            //}

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

修改Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace WebApiNet_v5
{
    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(cfg =>
            {
                cfg.ServiceName = "WebApiNet_v5";
            })

            ;
    }
}

配置Kestrel监听

参考文章

.Net Core 通过配置文件(appsetting.json)修改Kestrel启动端口

实际配置效果

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "Kestrel": {
    "EndPoints": {
      "Http": {
        "Url": "http://0.0.0.0:5003" // 端口自己改吧
      }
    }
  },
  "AllowedHosts": "*"
}

发布程序

发布到本地目录,如下图
在这里插入图片描述

通过命令行创建服务

注意:一定要以管理员身份运行,否则无权限
例如出现如下错误:
[SC] OpenSCManager 失败 5:
在这里插入图片描述

关于SC命令

在这里插入图片描述

启动服务查看效果

sc.exe start 1_v5

测试效果

在这里插入图片描述


.NET6

因为.net6的改版,已经没有Startup文件了,而且程序的启动已经不再使用IHostBuilder接口了。
所以如下记录的内容都是在.net5版本上的差异与变动
代码如下:

using Microsoft.Extensions.Hosting.WindowsServices;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using System.Net;

namespace WebApiNet_v6
{
    public class Program
    {
        public static void Main(string[] args)
        {
        //配置启动参数
            var options = new WebApplicationOptions
            {
                Args = args,
                ContentRootPath = WindowsServiceHelpers.IsWindowsService()
                                     ? AppContext.BaseDirectory : default
            };

            var builder = WebApplication.CreateBuilder(options);

            // Add services to the container.

            builder.Services.AddControllers();

            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();
//启动服务
            builder.Host.UseWindowsService();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            //if (app.Environment.IsDevelopment())
            //{
            app.UseSwagger();
            app.UseSwaggerUI();
            //}

            //app.UseHttpsRedirection();

            app.UseAuthorization();

            app.MapControllers();

            app.Run();
        }
    }
}

代码上的调整就这么多,但是在修改的过程中遇到了一些错误

错误1

出现 URL scheme must be http or https for CORS request

请添加图片描述

解决办法:

禁用https重定向,或者完全使用https都可以
禁用办法就是注释这行代码

//app.UseHttpsRedirection();

错误2

安装了服务怎么都无法开启
请添加图片描述

解决办法:因为没有证书,所以不配置https的终结点就可以了。

运行效果如下图

在这里插入图片描述

.NET7版本(和6版本一样就可以)

源码下载

https://download.csdn.net/download/iml6yu/87377783

在 Windows 服务中托管 ASP.NET Core

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

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

相关文章

千锋教育嵌入式物联网教程之系统编程篇学习-01

目录 课程视频链接 笔记目的 什么是系统编程 如何操作内核的系统调用 系统调用的分类​编辑 系统调用的返回值 系统调用IO函数 文件描述符 文件IO文件描述符与标准IO的文件指针对应关系 Man手册使用 open函数 函数调用失败打印错误 close函数 测试一个进程最多能产生多少个…

如何准备pmp考试?

一、考前五准备 1.知识准备&#xff1a;读透教材&#xff0c;仔细回顾知识点&#xff0c;明确知识框架&#xff0c;模考题考前正确率达到95%。 2.精神准备&#xff1a;明确目标&#xff0c;有信心&#xff0c;不要焦虑。 3.精力准备&#xff1a;科学安排考前的复习和休息时间…

【nvivo11plus教程】03_查询+自动编码

注&#xff1a;nvivo11也可以使用自动编码的。我是在第一次使用自动编码的时候&#xff0c;它弹出来一个界面让我下载安装包&#xff0c;但是网速特别慢&#xff0c;需要5、6个小时&#xff0c;然后我电脑开了一个晚上&#xff0c;第二天早上显示下载失败&#xff0c;但是可以使…

十一、路由

一、前端路由的概念与原理 1.1、什么是路由 路由&#xff08;英文&#xff1a;router&#xff09;就是对应关系。 1.2、SPA与前端路由 SPA 指的是一个web网站只有唯一的一个HTML页面&#xff0c;所有组件的展示与切换都在这唯一的一个页面内完成。此时&#xff0c;不同组件…

【 java 集合】Collections工具类的使用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

python基础语法二

一、条件判断 1.1 if…else…语句 if…else… 字面意思就是 如果…否则… num 3 # 通过取模运算判断num是否能被2整除 if num % 2 0:print(str(num) "是一个偶数") else:print(str(num) "是一个奇数")注意两条print语句前面的缩进 1.2 elif 当你有三…

DP4809国产双通道耳机音频功率放大器芯片兼容替代LM4809

目录DP4809简介参考原理图DP4809芯片特性DP4809简介 DP4809是带关机功能的双通道耳机音频功率放大器芯片。在5V输入工作电压下&#xff0c;负载 16Ω时&#xff0c;平均输出功率为 140mW&#xff0c;总谐波失真 THDN 小于0.1%。当 SHUTDOWN 管脚电压为 GND 时&#xff0c;芯片…

小程序技术科普:运行机制安全机制

接触小程序有一段时间了&#xff0c;总得来说小程序开发门槛比较低&#xff0c;但其中基本的运行机制和原理还是要懂的。 了解小程序的由来 在小程序没有出来之前&#xff0c;最初微信WebView逐渐成为移动web重要入口&#xff0c;微信发布了一整套网页开发工具包&#xff0c;称…

Windows安装Pytorch+CUDA环境

文章目录前言创建Python虚拟环境安装CUDA安装Pytorch参考资料前言 本文将介绍使用 conda 创建Python虚拟环境&#xff0c;安装Pytorch和CUDA依赖。 创建Python虚拟环境 conda常用命令&#xff1a; conda create -n poppy_leo_tf python3.7 # 创建虚拟环境 conda activate p…

grafana关闭缓存

如果把Prometheus配置文件中的一些端口删除再重启服务&#xff0c;虽然Prometheus中更新了数据&#xff0c;但是grafana中的缓存会存在很长时间。 在官方文档[数据源管理|格拉法纳文档 (grafana.com)](https://grafana.com/docs/grafana/latest/administration/user-managemen…

Leetcode - 19 - 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1],…

【Dash搭建可视化网站】项目11:世界自杀率数据看板

世界自杀率数据看板1 项目效果图2 项目架构3 文件介绍和功能完善3.1 assets文件夹介绍3.2 app.py和index.py文件完善3.3 header.py文件完善3.4 api.py/api.ipynb文件完善3.4.1 获取Dropdown组件中的下拉标签信息3.4.2 获取Rangeslider组件中的时间区间3.4.3 获取Checklist组件中…

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第五篇】【完结篇附源码】

在第四篇中我们学习了mixin 公共方法封装&#xff0c; VueRouter 的使用以及配置权限路由&#xff0c;本期我们将讲述 Pinia,并使用 Pinia 和 Axios接口数据完成登录功能以权限路由改造 本期需要掌握的知识如下: Pinia 在项目中的使用及 持久化使用 Pinia 和 Axios 完成 登录 …

VIMA: General Robot Manipulation with Multimodal Prompts

Paper name VIMA: General Robot Manipulation with Multimodal Prompts Paper Reading Note URL: https://arxiv.org/pdf/2210.03094.pdf Project URL: https://vimalabs.github.io/ ICLR review URL: https://openreview.net/forum?idhzjQWjPC04A TL;DR ICLR 2023 在投…

动态 json 转化序表

【问题】Hi,I have a problem very similar tohttp://community.jaspersoft.com/questions/844023/need-help-looping-throu…,but I can’t just change the json file as done by the person asking that question.Any help would be greatly appreciated.----I am trying to…

深入学习IO多路复用select/poll/epoll实现原理

这里写自定义目录标题参考概述1. Linux 怎样处理网络请求1.1 阻塞 IO1.2 非阻塞 IO1.3 IO 多路复用2. 详解 select、poll、epoll 实现原理2.1 select 实现原理2.2 poll 实现原理3. 总结参考 深入学习IO多路复用select/poll/epoll实现原理 概述 Linux 服务器处理网络请求有三…

Java基础算法每日5道详解(4)

101. Symmetric Tree 对称树 Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). Example 1: Input: root [1,2,2,3,4,4,3] Output: trueExample 2: Input: root [1,2,2,null,3,null,3] Output: falseleetco…

Linux常用命令——nl命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) nl 在Linux系统中计算文件内容行号 补充说明 nl命令读取 file 参数&#xff08;缺省情况下标准输入&#xff09;&#xff0c;计算输入中的行号&#xff0c;将计算过的行号写入标准输出。在输出中&#xff0c;n…

牛啊~ 长这么大还是头一次见24W字的SpringBoot从入门到实战文档

牛啊&#xff01;长这么大还是头一次见24W字的SpringBoot从入门到实战文档&#xff01; 不服还真不行&#xff0c;因为这份文档包含的内容是又全又新&#xff0c;而且还特别高深&#xff0c;从入门到实战的内容全都有&#xff01;&#xff01; 继续往下看&#xff1a; 本文档从…

EMQ设定ACL规则来控制客户端对主题的订阅权限

实现原理&#xff1a;EMQ可以通过制订ACL规则&#xff0c;校验客户端每个发布(Publish)/订阅(Subscribe) 的权限 本次采用的是EMQ Mnesia ACL。使用 EMQ X 内置的 Mnesia 数据库存储 ACL 规则 测试过程&#xff1a; 1本次实验环境&#xff0c;1个服务端&#xff08;发布1个主…