iis/iis express无需手动配置handlers,仅将 DLL 放入bin目录即可处理 HTTP 请求的功能

以下是使用VB.NET实现的方案,分别针对传统ASP.NET(System.Web)和ASP.NET Core 两种环境,实现无需手动配置handlers,仅将 DLL 放入bin目录即可处理 HTTP 请求的功能。

一、传统ASP.NET(System.Web)方案:自动注册 HTTP 模块

通过PreApplicationStartMethod特性实现模块自动注册,放入bin目录后即可生效。

VB.NET自动注册HTTP模块处理请求

Imports System.Web' 程序集级特性:指定应用启动时自动执行的初始化方法
<Assembly: PreApplicationStartMethod(GetType(UploadToolInitializer), "Initialize")> Namespace XiaoYaoWebCore' 自定义HTTP模块,处理请求逻辑Public Class UploadToolModuleImplements IHttpModulePublic Sub Init(context As HttpApplication) Implements IHttpModule.Init' 注册请求开始事件AddHandler context.BeginRequest, AddressOf OnBeginRequestEnd SubPrivate Sub OnBeginRequest(sender As Object, e As EventArgs)Dim app As HttpApplication = DirectCast(sender, HttpApplication)Dim request As HttpRequest = app.Context.RequestDim response As HttpResponse = app.Context.Response' 只处理特定路径的请求If request.Path.StartsWith("/UploadTool", StringComparison.OrdinalIgnoreCase) Then' 这里是你的业务处理逻辑response.ContentType = "text/plain"response.Write("VB.NET自动加载模块处理成功:" & DateTime.Now.ToString())response.End() ' 终止后续处理End IfEnd SubPublic Sub Dispose() Implements IHttpModule.Dispose' 清理资源(如果需要)End SubEnd Class' 初始化器:负责自动注册模块Public NotInheritable Class UploadToolInitializerPrivate Sub New()End Sub' 应用启动时自动调用此方法Public Shared Sub Initialize()' 向ASP.NET管道注册模块HttpApplication.RegisterModule(GetType(UploadToolModule))End SubEnd Class
End Namespace

二、ASP.NET Core 方案:自动扫描并注册中间件

主项目提前配置扫描逻辑,DLL 中的中间件会被自动发现并注册。

1. DLL 中的中间件实现(VB.NET)
VB.NET ASP.NET Core中间件
Imports Microsoft.AspNetCore.Http
Imports System.Threading.TasksNamespace XiaoYaoWebCorePublic Class UploadToolMiddlewarePrivate ReadOnly _next As RequestDelegate' 构造函数,接收下一个中间件Public Sub New(next As RequestDelegate)_next = nextEnd Sub' 处理请求的核心方法Public Async Function InvokeAsync(context As HttpContext) As Task' 匹配特定路径If context.Request.Path.StartsWithSegments("/UploadTool") Thencontext.Response.ContentType = "text/plain"Await context.Response.WriteAsync("VB.NET Core中间件自动处理成功:" & DateTime.Now.ToString())Return ' 处理完成,不再调用下一个中间件End If' 不匹配则传递给下一个中间件Await _next(context)End FunctionEnd Class
End Namespace

2. 主项目扫描逻辑(Program.vb)主项目扫描并注册中间件

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Hosting
Imports System.Reflection
Imports System.IOModule ProgramSub Main(args As String())Dim builder = WebApplication.CreateBuilder(args)Dim app = builder.Build()' 扫描bin目录中的所有DLL,自动注册中间件ScanAndRegisterMiddleware(app)app.Run()End Sub' 扫描bin目录并注册符合约定的中间件Private Sub ScanAndRegisterMiddleware(app As WebApplication)Dim binPath = Path.Combine(app.Environment.ContentRootPath, "bin")If Not Directory.Exists(binPath) Then ReturnFor Each dllFile In Directory.GetFiles(binPath, "*.dll", SearchOption.AllDirectories)Try' 加载DLLDim assembly = Assembly.LoadFrom(dllFile)' 查找符合约定的中间件(类名以Middleware结尾,有正确的构造函数和InvokeAsync方法)For Each type In assembly.GetTypes()If type.Name.EndsWith("Middleware") AndAlso type.GetConstructor({GetType(RequestDelegate)}) IsNot Nothing AndAlsotype.GetMethod("InvokeAsync") IsNot Nothing Then' 注册中间件app.Use(Function(context, next)' 反射创建中间件实例并调用Dim middleware = Activator.CreateInstance(type, next)Return CType(type.GetMethod("InvokeAsync").Invoke(middleware, {context}), Task)End Function)End IfNextCatch ex As Exception' 忽略加载失败的DLL(如系统组件)Console.WriteLine($"加载DLL失败:{dllFile},错误:{ex.Message}")End TryNextEnd Sub
End Module

实现说明

传统ASP.NET方案工作原理:
  1. 通过PreApplicationStartMethod特性,ASP.NET在应用启动时会自动执行UploadToolInitializer.Initialize方法
  2. 该方法通过HttpApplication.RegisterModule向管道注册自定义模块
  3. 模块在BeginRequest事件中拦截特定路径请求并处理
  4. 只需将编译后的 DLL 放入项目bin目录,无需修改web.confighandlersmodules
ASP.NET Core 方案工作原理:
  1. 主项目在启动时扫描bin目录中的所有 DLL
  2. 自动发现符合约定(类名以Middleware结尾)的中间件类
  3. 通过反射机制将中间件注册到请求处理管道
  4. 中间件会拦截匹配/UploadTool路径的请求并处理

使用方法

  1. 将上述代码编译为 DLL(如XiaoYaoWebCore.dll
  2. 直接放入对应ASP.NET或ASP.NET Core 项目的bin目录
  3. 启动 IIS Express,访问http://localhost:端口/UploadTool即可看到处理结果

这种方式实现了 “仅放 DLL 到 bin 目录即可处理请求” 的需求,无需手动配置handlers

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

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

相关文章

【DP】单词的划分

题目描述 有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析&#xff0c;需要将它划分成若干个部分&#xff0c;每个部分称为一个单词。出于减少分析量的目的&#xff0c;我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。 输入 第一行&#xff0c…

UniApp 中使用 tui-xecharts插件(或类似图表库如 uCharts)

要在 UniApp 中使用 tui-xecharts插件&#xff08;或类似图表库如 uCharts&#xff09;&#xff0c;需遵循以下步骤。以下流程以 ​​uCharts​​&#xff08;官方推荐的高性能跨平台图表库&#xff09;为例&#xff0c;因其在 UniApp 生态中更成熟且文档完善。若需使用 tui-xe…

顺序表 —— OJ题

在上一篇文章中简单介绍了顺序表&#xff0c;这一篇文章讲解下一个比较经典的题&#xff1a;杨辉三角先看一下什么是杨辉三角下面解释&#xff1a;大概就是这个规律。而 ta 其实就是二维数组 即&#xff1a;0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1然后看一下这个题的要求…

基于单片机的防酒驾系统设计

一、引言1.1 研究背景与意义随着社会经济的快速发展&#xff0c;汽车保有量持续攀升&#xff0c;道路交通安全问题愈发凸显。酒后驾驶作为交通事故的主要诱因之一&#xff0c;严重威胁着人们的生命财产安全。据统计&#xff0c;全球每年因酒驾造成的交通事故死亡人数高达数十万…

Redis面试精讲 Day 22:Redis布隆过滤器应用场景

【Redis面试精讲 Day 22】Redis布隆过滤器应用场景 在高并发、大数据量的互联网系统中&#xff0c;如何高效判断一个元素是否存在于集合中&#xff0c;是缓存设计中的关键问题。尤其是在面对缓存穿透——即恶意或无效请求频繁查询不存在的数据&#xff0c;导致数据库压力剧增—…

Spark Shuffle中的数据结构

文章目录1.Shuffle中的三种数据结构2.AppendOnlyMap原理2.1 聚合2.2 扩容2.3 排序2.4 为什么是数组&#xff1f;3.ExternalAppendOnlyMap原理3.1 工作原理3.2 AppendOnlyMap大小估计3.2.1 为什么要估计大小&#xff1f;3.2.2 估计大小浅析3.2.2.1 什么时候采样&#xff1f;3.2.…

告别在线转换风险:本地运行的PDF转Word技术评测

Word文档&#xff08;.docx&#xff09;是可编辑的主流办公格式&#xff0c;支持灵活修改文字、排版、图片、表格等。它的体积仅有5.5M&#xff0c;小巧不占空间&#xff0c;且转换不限文件大小&#xff0c;随用随转&#xff0c;毫无限制。初次使用需完成一次安装&#xff0c;之…

整体设计 符号学与诠释学融合的整体设计框架(本篇暂时命名)--PromptPilot (助手)答问之1

说明 本系列篇&#xff08;分多篇&#xff09;是就前面 已经和腾讯元宝就“整体设计”的讨论内容 再和 PromptPilot &#xff08;助手&#xff09;的再次沟通。但内容做了部分修正一边 更准确和完整。摘要&#xff08;CSDN的AI助手提取的&#xff09;符号学与诠释学融合的整体设…

Font shape `TU/ptm/m/n‘ undefined(Font) using `TU/lmr/m/n‘ instead

一、警告内容 这是 LaTeX 字体选择机制输出的信息。我们可以把 TU/ptm/m/n 分解来看&#xff1a; TU → 编码 (font encoding) TU 表示 Unicode TeX encoding&#xff0c;即新版 XeLaTeX/LuaLaTeX 下的 Unicode 字体编码。 ptm → 字体族 (family) ptm 代表 Times 字体 (PostS…

拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用

拒绝造轮子&#xff08;C#篇&#xff09;ZLG CAN卡驱动封装应用 今天给大家介绍一个封装完善的CAN卡类。 背景 在面对常规开发场景&#xff0c;开发者对复杂SDK进行封装和测试。阅读相关开发资料和理解SDK的DEMO程序。 开篇 如果你也有同样的烦恼&#xff0c;那就来看看今…

机器学习相关算法:回溯算法 贪心算法 回归算法(线性回归) 算法超参数 多项式时间 朴素贝叶斯分类算法

整理了一张“机器学习相关算法与概念速览表”&#xff0c;既包含定义&#xff0c;也配上了容易记住的例子&#xff0c;让大家一眼就能抓住它们的特点&#xff1a; &#x1f916; 机器学习与相关算法&概念 名称定义生动例子典型应用场景回溯算法通过不断尝试和回退来寻找问…

vue+微信小程序 五角星

说明&#xff1a;这个是先画出一个72度菱形&#xff0c;长中长线和短中长线按照一定比例&#xff0c;然后把菱形分层十份&#xff0c;最后再把菱形进行旋转形成五角星&#xff0c;最后显示标签&#xff0c;因为一直对不上所以对标签做了点操作 <template><view class&…

Prometheus + Grafana 深度玩法:从零到智能化监控体系

0. 写在前面&#xff1a;为什么你需要“神器”而非“常用命令老杨折腾监控系统可是有年头了&#xff0c;最早还用过 Cacti、Zabbix&#xff0c;那会儿做个仪表盘都得像雕花一样慢慢刻。后来 Prometheus 出来之后&#xff0c;我的第一反应是&#xff1a;这玩意儿的时间序列和标签…

YOLO、DarkNet和深度学习如何让自动驾驶看得清?

【导读】 本文提出 DarkNet-YOLO 工业级实践框架&#xff0c;通过引入 残差优化结构 与 多尺度特征融合技术&#xff0c;在保持实时检测精度同时显著提升复杂场景适应性。 目录 一、目标检测的进化之路&#xff1a;从“两步走”到“一眼定乾坤” YOLO的核心思想&#xff1a…

使用 HTML5 Canvas 打造炫酷的数字时钟动画

在 Web 开发中&#xff0c;HTML5 的 canvas 元素为我们带来了强大的绘图能力&#xff0c;结合 JavaScript&#xff0c;可以实现各种酷炫的效果。今天&#xff0c;我们将深入剖析一段经典的 彩色数字时钟动画 代码&#xff0c;并理解它是如何通过物理模拟实现数字切换时的炫酷粒…

XCZU6CG-2FFVC900I Xilinx FPGA AMD ZynqUltraScale+ MPSoC

XCZU6CG-2FFVC900I Xilinx FPGA&#xff08; AMD&#xff09;Zynq UltraScale MPSoC 。在处理系统&#xff08;PS&#xff09;方面&#xff0c;XCZU6CG 系列通常集成了 ARM Cortex-A53 应用核与 Cortex-R5 实时核的组合&#xff08;典型为 A53 多核 R5 双核组合&#xff09;&…

Navicat 询问 AI | 优化 SQL 查询

近期&#xff0c;我们发布了 Navicat 17.3 版本。这一版本实现了全方位升级&#xff0c;包括对 AI 功能大升级、支持达梦、金仓、瀚高、支持阿里通义千问等 AI 大模型&#xff0c;支持凝思 OS 以及多项 UI 改进。今天&#xff0c;我们将深入介绍 Navicat AI 功能之“询问 AI ”…

4.6 Vue 3 中的模板引用 (Template Refs)

在 Vue 3 中&#xff0c;ref 是一个核心的响应式 API&#xff0c;但它在模板中还有另一个非常重要的用途&#xff1a;获取对 DOM 元素或子组件实例的直接引用。这就是我们所说的“模板引用”。核心概念目的&#xff1a;让你在父组件中能够直接访问并操作特定的 DOM 元素或子组件…

模式匹配自动机全面理论分析

模式匹配是什么 模式匹配是计算机科学中一个基础且重要的问题&#xff0c;广泛应用于文本编辑、信息检索、网络安全、生物信息学等多个领域。简单来说&#xff0c;模式匹配就是在一个主文本中查找一个或多个特定模式串的出现位置。随着计算机处理能力的提升和数据规模的扩大&am…

AI 搜索时代:引领变革,重塑您的 SEO 战略

随着谷歌转向人工智能驱动的答案&#xff0c;使用以关键字和反向链接为中心的过时和传统的 SEO 策略不再起到任何作用。 由于 Google AI Overviews 和零点击搜索的兴起&#xff0c;自然点击量正在下降&#xff0c;用户无需点击任何网站即可直接在 Google 的搜索结果页面上获得答…