当前位置: 首页 > news >正文

ASP.NET Core - IStartupFilter 与 IHostingStartup

ASP.NET Core - IStartupFilter 与 IHostingStartup

  • 1. IStartupFilter
  • 2 IHostingStartup
      • 2.5.1 创建外部程序集
      • 2.5.2 激活外部程序集

1. IStartupFilter

  上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离,但是有些时候我们还会可以根据应用中的功能点将一系列相关中间件的注册封装到一起,从 Startup 类中分离,单独进行维护,以便更清晰地管理我们的代码。

  这时候我们可以实现 IStartupFilter 接口,然后将其注入到容器之中,在应用启动的时候 IStartupFilter 实现类会被执行,从而完成对中间件的配置。

  在 IStartupFilter 中配置的中间件,总是比 Startup 类中 Configure 方法中的中间件先注册;对于多个 IStartupFilter 实现,执行顺序与服务注册时的顺序相反

  通过源码可以看到,ASP.NET Core 框架在创建应用的时候,会从容器中提取出所有的 IStartupFilter 的实现类,循环执行,然后再执行 Startup 类中的 Configure 方法。

在这里插入图片描述
下面是一个测试例子 :

public class FirstStartupFilter : IStartupFilter
{public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next){Console.WriteLine("FirstStartupFilter");return app => next(app);}
}public class SecondStartupFilter : IStartupFilter
{public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next){Console.WriteLine("SecondStartupFilter");return app => next(app);}
}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){Console.WriteLine("Startup: ConfigureServices");services.AddTransient<IStartupFilter, FirstStartupFilter>();services.AddTransient<IStartupFilter, SecondStartupFilter>();services.AddControllers();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){Console.WriteLine("Startup.Configure");if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRoutingapp.UseAuthorizationapp.UseEndpoints(endpoints =>{endpoints.MapControllers();});}
}

执行结果如下:
在这里插入图片描述

2 IHostingStartup

  第一次接触 IHostingStartup 的应用是在 Skywalking 的使用之中,当初觉得 Skywalking 仅仅通过配置一个环境变量就能集成相关的功能非常神奇,并不知道具体是怎么实现的。后面出于这点好奇心,了解了一下相关的原理,才知道原来是使用了 IHostingStartup 在启动时通过外部程序集向应用增加更多功能,它是 ASP.NETCore 框架原生提供的一种进行模块化开发的方式,使用它必须通过 Web 主机调用 ConfigureWebHost、ConfigureWebHostDefaults 配置方法。

通过源码可以看到,在调用 Build 方法构建主机的时候会获取外部程序集名称,然后将其加载,再通过HostingStartupAttribute 程序集特性找到配置的 HostingStartType,该类需要实现 IHostingStartup 接口,之后反射生成实例,调用其中的 Configure 方法,传入 IWebHostBuider 对象,因此在 IHostingStartup 实现类中一样可以进行依赖注入、管道配置。

在这里插入图片描述
在这里插入图片描述
再看怎么获取外部程序集名称的:

在这里插入图片描述
在这里插入图片描述
可以看到是从配置系统中获取的,而 key 是 WebHostDefaults.HostingStartupAssembliesKey 常量,也就是 hostingStartupAssemblies,由于这里是 主机配置,所以我们可以通过 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 进行设置,Web 主机在加载环境变量的时候会截去前缀 ASPNETCORE_ ,配置系统中 key 不区分大小写。

在这里插入图片描述
下面看看如何使用 IHostingStartup:

2.5.1 创建外部程序集

首先我们创建 HostingStartup 程序集,可以通过创建类库项目或无入口点的控制台应用来实现。

在这里插入图片描述
之后创建一个 IHostingStartup 接口的实现类

[assembly: HostingStartup(typeof(MyHostingStartup))]
namespace HostingStartupLib
{public class MyHostingStartup : IHostingStartup{public void Configure(IWebHostBuilder builder){builder.ConfigureServices(services => { }).ConfigureAppConfiguration(app => { });Console.WriteLine("Init External Amsebly!");}}
}

该类的 Configure 方法中入参为 IWebHostBuilder ,通过 IWebHostBuilder 来添加增强功能,像 Program.cs 文件中对主机进行配置一样。

之后,需要配置 HostingStartup 特性,这是一个程序集特性,指定当前程序集的 IHostingStartup 实现类类型。

2.5.2 激活外部程序集

有了一个这样的 HostingStartup 外部程序集之后,我们在主体应用项目中可以这样进行激活。

首先,将该程序集应用进项目之中:

在这里插入图片描述
然后,向配置系统中设置外部程序集的名称,以实现在构建主机的时候进行加载,由于是主机配置,所以我们可以通过几种方式进行设置:

(1) 在构建主机的时候进行配置

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey,"HostingStartupLib").UseStartup<Startup>();});

其实这里的 UseSetting 方法就是就是往配置系统中添加配置而已

在这里插入图片描述
(2) 通过环境变量进行设置

Web主机在启动的时候会通过环境变量提供程序获取环境变量作为主机配置,并且会在写入配置系统的时候会截取掉 ASPNET_ 前缀,我们在配置的时候要用 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 作为 key。这种无需侵入程序代码,是更为推荐的方式。

我们可以直接在机器的环境变量列表中配置,但是如果只是开发环境的话也可以通过 launchSettings.json 。

在这里插入图片描述
无论是那种配置方式,如果需要同时激活多个外部程序集可以用英文逗号 ; 分隔。除了 ASPNETCORE_HOSTINGSTARTUPASSEMBLIES 环境变量之外,和外部程序集有关的配置还有 ASPNETCORE_HOSTINGSTARTUPEXCLUDEASSEMBLIES,用于排除要激活的程序集,ASPNETCORE_PREVENTHOSTINGSTARTUP,用于配置是否禁止外部程序集。



参考文章:

官方文档-托管启动程序集
理解ASP.NET Core - Startup



ASP.NET Core 系列总结:

目录:ASP.NET Core 系列总结
上一篇:ASP.NET Core — 入口文件
下一篇:ASP.NET Core - .NET 6 的入口文件

相关文章:

ASP.NET Core - IStartupFilter 与 IHostingStartup

ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离&#xff0c;但是有些时候我们还会可以根据应用中的功能…...

【零基础租赁实惠GPU推荐及大语言模型部署教程01】

租赁GPU推荐及大语言模型部署简易教程 1 官网地址2 注册账号及登录3 租用GPU3.1 充值&#xff08;不限制充值最低金额&#xff0c;1元亦可&#xff09;3.2 容器实例&#xff08;实际就是你租用的GPU电脑&#xff09;3.3 选择镜像&#xff08;选择基础环境&#xff1a;框架版本和…...

接口传参 data格式和json格式区别是什么

接口传参 data格式和json格式区别是什么 以下是接口传参 data 格式和 JSON 格式的区别&#xff1a; 定义和范围 Data 格式&#xff1a; 是一个较为宽泛的概念&#xff0c;它可以指代接口传递参数时所使用的任何数据的组织形式。包括但不限于 JSON、XML、Form 数据、纯文本、二进…...

踏上 C++ 编程之旅:开篇之作

踏上 C 编程之旅&#xff1a;开篇之作 在计算机编程的广袤天地中&#xff0c;C 宛如一座巍峨的高峰&#xff0c;吸引着无数开发者攀登探索。今天&#xff0c;就让我们一同开启这段充满挑战与惊喜的 C 编程之旅&#xff0c;在代码的世界里开辟属于自己的道路。 一、为什么选择…...

docker在不删除容器的情况下修改端口映射

注意&#xff1a;必须先停止docker服务&#xff01;&#xff01;&#xff01;&#xff01; 1) 停止容器 2) 停止docker服务(systemctl stop docker) 3) 修改这个容器的hostconfig.json和config.v2.json文件中的端口 先查看容器id docker inspect jenkins 进入该目录 hostcon…...

Mysql tinyint与Java的数据类型的对应关系

参考资料 理解误区——mysql中tinyint与Java的数据类型的对应关系&#xff1b;tinyint(1) 与tinyint(4)的区别 1.1 tinyint字段取值 数据库字段类型为 tinyint,值为0或1,直接通过SQL语句查询的话,0会取出false;1会取出true目前就想取出的结果为 0 或 1 selectpg_id ,pg_name…...

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器&#xff1a; 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu&#xff1f;” q&a&#x1f517;&#xff1a;https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…...

掌握 Ubuntu 终端 mv 与 rename 命令的高效重命名使用方法

在日常的计算任务中&#xff0c;文件重命名是一个经常性的需求。对于熟悉图形用户界面&#xff08;GUI&#xff09;的人来说&#xff0c;通过右键点击并选择“重命名”选项&#xff0c;这个过程简单直接。然而&#xff0c;当涉及到大量文件或需要自动化流程时&#xff0c;命令行…...

【Python】数据容器:列表,元组,字符串,集合字典及通用操作

文章目录 一.序列1.1list列表定义常用操作列表的遍历 1.2tuple元组定义常见操作元组的遍历 1.3str字符串定义常见操作字符串的遍历 1.4序列常用操作——切片 二.set集合定义常见操作集合的遍历 三.dict字典定义常用操作字典的嵌套 *数据容器对比总结四.数据容器的通用操作4.1通…...

基于Oracle与PyQt6的电子病历多模态大模型图形化查询系统编程构建

一、引言 1.1 研究背景阐述 在当今数字化时代,医疗行业正经历着深刻的变革,数字化转型的需求日益迫切。电子病历(EMR)作为医疗信息化的核心,其管理的高效性和数据利用的深度对于提升医疗服务质量、优化临床决策以及推动医学研究具有至关重要的意义。传统的电子病历管理系…...

2025智能网联汽车数据分类分级白皮书

智能网联汽车作为现代交通技术的重要成果&#xff0c;其核心特征之一是产生了大量的、多样化的数据&#xff0c;这些数据不仅对提升车辆性能和用户体验至关重要&#xff0c;对维护交通安全、推动智能交通系统的发展具有深远影响。在数字经济时代&#xff0c;数据的价值日益凸显…...

使用Dify创建个问卷调查的工作流

为啥要使用Dify创建工作流呢&#xff1f;一个基于流程的智能体的实现&#xff0c;特别是基于业务的实现&#xff0c;使用Dify去实现时&#xff0c;通常都是一个对话工作流&#xff0c;当设计到相对复杂一些的流程时&#xff0c;如果将所有逻辑都放在对话工作流中去实现&#xf…...

紫光无人机AI飞控平台介绍

随着无人机技术的迅猛发展&#xff0c;无人机飞控平台的智能化需求不断提升。紫光无人机AI飞控平台作为一款创新型产品&#xff0c;为用户提供了从飞行控制到任务管理的一站式解决方案&#xff0c;尤其在AI实时识别和事件分析方面具有显著优势。本文将介绍平台的核心功能、技术…...

UI自动化测试:异常截图和page_source

自动化测试过程中&#xff0c;是否遇到过脚本执行中途出错却不知道原因的情况&#xff1f;测试人员面临的不仅是问题的复现&#xff0c;还有对错误的快速定位和分析。而异常截图与页面源码&#xff08;Page Source&#xff09;的结合&#xff0c;正是解决这一难题的利器。 在实…...

47,【5】BUUCTF web lovesql

进入靶场 可知是单引号闭合&#xff0c;属于字符串型注入 则后续方法与字符串型无异 使用order by 判断出字节数为3 使用union select寻找注入点时切记第一个select为空 库名geek 表名group_concat(table_name) from information_schema.tables where table_schemageek# geek…...

网络安全——常用语及linux系统

一、网络安全概念及法规 网络安全&#xff1a;网络空间安全 cyber security 信息系统&#xff1a;由计算机硬件、网络和通信设备、计算机软件、信息资源、信息用户和规章制度组成的已处理信息流为目的的人机一体化系统 信息系统安全三要素&#xff08;CIA&#xff09; 保密…...

json().get() 和 json[““] 的区别

以下是 json().get() 和 json[“”] 的区别&#xff1a; 使用方法和语法 json[“”]&#xff1a; 这是使用字典的索引操作符 [] 来访问 JSON 数据。假设 json 是一个字典&#xff0c;你可以通过 json[“key”] 的方式来获取对应 key 的值。 示例&#xff1a; python import js…...

深入解析CSS属性值计算:从声明到渲染的完整流程

目录 引言1. 确定声明值2. 层叠冲突3. 使用继承4. 使用默认值总结 引言 在网页开发中&#xff0c;理解CSS属性值的计算过程对于开发者来说至关重要。它不仅影响页面样式的最终呈现&#xff0c;还涉及到浏览器如何解析和应用样式规则。本文将深入探讨从无属性值到每个属性都有…...

npm发布工具包+使用

1.初始化package包 npm init -y {"name": "common-cjs-tools","version": "1.0.0","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" &&…...

28:CAN总线入门一:CAN的基本介绍

CAN总线入门 1、CAN总线简介和硬件电路1.1、CAN简要介绍1.2、硬件电路1.3、CAN总线的电平标准 2、帧格式2.1、数据帧&#xff08;掌握&#xff09;2.2、遥控帧&#xff08;掌握&#xff09;2.3、错误帧&#xff08;了解&#xff09;2.4、过载帧&#xff08;了解&#xff09;2.5…...

RK3568平台(音频篇)lineout无声调试

一.声音硬件框架 硬件HP_MUTE已强制拉低。 二.设备树配置 es8388_sound: es8388-sound {status = "okay";compatible = "rockchip,multicodecs-card";rockchip,card-name = "rockchip-es8388";hp-det-gpio = <&gpio1 RK_PD2 GPIO_ACT…...

ros2-7.5 做一个自动巡检机器人

7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求&#xff1a;做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息&#xff0c; 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…...

服务器下发任务镭速利用变量实现高效的大文件传输效率

在分布式系统和自动化部署场景中&#xff0c;任务下发往往伴随着大量的文件传输需求。为了提高文件传输的效率&#xff0c;本文将介绍如何巧妙地利用变量来优化任务下发过程中的文件传输。我们将介绍几种方法&#xff0c;通过合理利用变量来减少传输负担、提升传输速度&#xf…...

本地用docker装mysql

目录 拉取镜像查看镜像 启动容器查看运行中的容器连接到 MySQL 容器其他一些操作 装WorkBench链接mysql——————————————允许远程登录MySql 拉取镜像 docker pull mysql查看镜像 docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE mysq…...

前端canvas对象转成file对象

import html2canvas from html2canvasexport default {methods: {//canvas对象转成file对象canvasToFile() {html2canvas(this.$parent.$refs[mapPanel].$el,{width: this.$parent.$refs[mapPanel].$el.clientWidth - 600// height:}).then(canvas > {const base64Data can…...

mermaid大全(语法、流程图、时序图、甘特图、饼图、用户旅行图、类图)

⚠️ 有些网站的mermaid可能不完整&#xff0c;因此下面教程中可能有些语法是无效的。 &#x1f60a;亲测Typora软件均可以显示。 1. 介绍 Mermaid是一个基于JavaScript的图表绘制工具&#xff0c;它使用类似Markdown的语法来创建和修改各种类型的图表。以下是关于Mermaid的详…...

运行fastGPT 第四步 配置ONE API 添加模型

上次已经装好了所有的依赖和程序。 下面在网页中配置One API &#xff0c;这个是大模型的接口。配置好了之后&#xff0c;就可以配置fastGPT了。 打开 OneAPI 页面 添加模型 这里要添加具体的付费模型的API接口填进来。 可以通过ip:3001访问OneAPI后台&#xff0c;**默认账号…...

Spring Initializr创建springboot项目 “java: 错误: 无效的源发行版:19”

我用的1.8的jdk&#xff0c;排查发现这是jdk和springboot版本冲突导致的。 1、File->Project Structure->Project Settings->Project,把language level改成相应的版本 2、File->Project Structure->Module&#xff0c;source和dependancies改成相应的版本 3、F…...

Java IDEA中Gutter Icons图标的含义

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a; 很多人刚开始用IDEA来学习编程&#xff0c;会发现下面这些图标。 但是…...

如何进行域名跳转与域名重定向的综合指南

文章摘取于 Dynadot官方博客内容。 在访问一些商业网站时&#xff0c;我们通常会发现这些平台会将多个域名都指向到同一个内容界面。当然&#xff0c;也存在网站迁移到新域名&#xff0c;旧域名则指向新域名以及其内容页面的情况。 这两者实际上都属于域名跳转的范畴&#xff…...