【ASP.NET Core 基础知识】--中间件--内置中间件的使用

ASP.NET Core 中包含很多内置的中间件,我们不可能对每一个内置的中间件进行一一讲解,并且中间件的使用步骤大致一样,因此本文讲解几个常用的内置中间件以及使用中间件的步骤,希望读者们可以举一反三。

一、内置中间件的介绍

1.1 静态文件中间件

在ASP.NET Core中,静态文件中间件是一种用于处理和提供静态文件的内置中间件。静态文件通常包括像样式表、脚本文件、图像以及其他客户端可以直接请求的文件。静态文件中间件能够有效地处理这些文件的请求,提高应用程序的性能。

  1. 配置静态文件中间件
    要使用静态文件中间件,首先需要在Startup.cs文件的Configure方法中进行配置。以下是一个简单的配置示例:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");app.UseHsts();}app.UseHttpsRedirection();app.UseStaticFiles(); // 配置静态文件中间件// 其他中间件和配置
}
  1. 设置静态文件路径和缓存
    静态文件中间件默认会查找wwwroot文件夹中的静态文件。你可以通过以下方式更改默认的静态文件路径:
app.UseStaticFiles(new StaticFileOptions
{FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),RequestPath = "/StaticFiles"
});

上述示例中,MyStaticFiles目录将被用作静态文件的根目录,而/StaticFiles路径将用于访问这些文件。
还可以配置静态文件中间件来启用缓存,以提高性能:

app.UseStaticFiles(new StaticFileOptions
{OnPrepareResponse = ctx =>{ctx.Context.Response.Headers.Add("Cache-Control", "public, max-age=600");}
});

上述示例中,Cache-Control头信息将被添加到响应中,允许浏览器缓存静态文件。

1.2 身份验证中间件

ASP.NET Core中的身份验证中间件用于处理用户身份验证和授权。身份验证是确保用户是谁的过程,而授权则是确定用户是否有权限执行特定操作的过程。

  1. 概念:

    • 认证(Authentication):确认用户的身份。这可以是用户名和密码、令牌、证书等。
    • 授权(Authorization):确定用户是否有权限执行某个操作或访问某个资源。
    • 声明(Claims):关于用户的一些信息,例如名称、角色等。身份验证后,这些信息被封装在声明中,方便应用程序使用。
    • 身份(Authentication Scheme):定义了身份验证的方法,如Cookies、Bearer Token等。
  2. 用法:

    • 配置身份验证中间件
      Startup.cs文件的ConfigureServices方法中配置身份验证服务:
    public void ConfigureServices(IServiceCollection services)
    {services.AddAuthentication("MyAuthenticationScheme").AddCookie("MyAuthenticationScheme", options =>{options.LoginPath = "/Account/Login";options.AccessDeniedPath = "/Account/AccessDenied";});// 其他服务配置
    }
    

    上述示例中,使用了Cookies作为身份验证方案,设置了登录和拒绝访问的路径。

    • 在管道中使用身份验证中间件
      Startup.cs文件的Configure方法中,将身份验证中间件添加到管道中:
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {// 其他中间件app.UseAuthentication(); // 添加身份验证中间件// 其他中间件
    }
    
    • 定义授权策略
      在控制器或操作方法上使用Authorize特性来定义访问策略:
    [Authorize(Policy = "RequireAdminRole")]
    public class AdminController : Controller
    {// 控制器的操作方法
    }
    

    Startup.cs中定义授权策略:

    public void ConfigureServices(IServiceCollection services)
    {// 其他服务配置services.AddAuthorization(options =>{options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin"));});
    }
    

    上述示例中,要访问AdminController,用户必须具有"Admin"角色。

1.3 路由中间件

ASP.NET Core中的路由中间件用于将传入请求映射到处理请求的代码。路由是一个关键的组件,负责解释传入的URL并决定应该调用应用程序中的哪个处理程序。

  1. 概念:

    • 路由模式(Route Pattern):定义了一个URL应该如何匹配路由。路由模式可以包含常规文本和参数。
    • 路由表(Route Table):包含了路由规则和它们应该映射到的处理程序。
    • 控制器(Controller):包含操作方法的类。控制器负责处理请求并生成响应。
    • 操作方法(Action Method):控制器中的方法,负责处理请求的特定部分。
  2. 用法:

    • 配置路由中间件
      Startup.cs文件的ConfigureServices方法中配置路由服务:
    public void ConfigureServices(IServiceCollection services)
    {services.AddControllersWithViews();// 其他服务配置
    }
    
    • 在管道中使用路由中间件
      Startup.cs文件的Configure方法中,将路由中间件添加到管道中:
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {// 其他中间件app.UseRouting(); // 添加路由中间件// 其他中间件
    }
    
    • 定义路由规则
      Startup.cs文件的Configure方法中定义路由规则:
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {// 其他中间件app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});// 其他中间件
    }
    

    上述例子中,定义了一个默认的控制器路由,将请求映射到名为Home的控制器的Index方法。{controller}, {action}, 和 {id?} 是路由模式的参数。

1.4 异常处理中间件

ASP.NET Core中的异常处理中间件用于处理应用程序中发生的异常,提供一种集中管理和处理异常的机制。异常处理中间件可以捕获应用程序中未处理的异常,并将用户友好的错误信息返回给客户端,同时记录详细的错误信息以供开发人员调查。以下是关于异常处理中间件的概念和用法的信息:

异常处理中间件概念

异常处理中间件是一个用于集中处理应用程序异常的组件。它位于ASP.NET Core的请求处理管道中,可以截获在应用程序执行过程中抛出的未处理异常,然后执行相应的处理逻辑。异常处理中间件有助于提高应用程序的可靠性和用户体验。

  1. 概念:

    • 全局异常处理(Global Exception Handling):异常处理中间件提供了一种机制,使开发人员能够定义全局的异常处理逻辑,而不必在每个操作方法中都进行异常处理。
    • 用户友好的错误页面(User-Friendly Error Pages):异常处理中间件可以配置以显示友好的错误页面,而不是将详细的异常信息暴露给终端用户。
    • 日志记录(Logging):除了提供用户友好的错误页面外,异常处理中间件还通常记录异常信息,以便开发人员能够追踪和调查应用程序中的问题。
  2. 用法:

    • 配置异常处理中间件
      Startup.cs文件的Configure方法中配置异常处理中间件:
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {// 其他中间件if (env.IsDevelopment()){app.UseDeveloperExceptionPage(); // 在开发环境下显示详细的异常信息页面}else{app.UseExceptionHandler("/Home/Error"); // 在生产环境下使用自定义的错误页面app.UseHsts();}// 其他中间件
    }
    

    上述例子中,如果应用程序运行在开发环境,将使用UseDeveloperExceptionPage中间件来显示详细的异常信息页面;如果运行在生产环境,将使用UseExceptionHandler中间件来显示自定义的错误页面。

    • 自定义错误页面
      Startup.cs文件中定义自定义的错误页面:
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {// 其他中间件app.UseExceptionHandler("/Home/Error");app.UseHsts();// 其他中间件
    }
    

    上述例子中,/Home/Error是一个控制器中的操作方法,用于显示自定义的错误页面。

    • 异常日志记录
      通常,你还希望记录应用程序中发生的异常。这可以通过配置日志记录中间件来实现:
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger<Startup> logger)
    {// 其他中间件app.UseExceptionHandler(errorApp =>{errorApp.Run(async context =>{context.Response.StatusCode = 500; // 设置HTTP状态码为500context.Response.ContentType = "text/html";var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();if (exceptionHandlerPathFeature?.Error != null){// 记录异常信息logger.LogError($"Error: {exceptionHandlerPathFeature.Error}");// 渲染自定义错误页面或返回友好的错误信息给用户await context.Response.WriteAsync("An unexpected error occurred! Please try again later.");}});});// 其他中间件
    }
    

    上述例子中,通过ILogger<Startup>来记录异常信息,并向用户返回一个友好的错误信息。你可以根据应用程序的需要,定制异常处理逻辑和错误页面的显示方式。

二、使用内置中间件的步骤

2.1 使用步骤

在ASP.NET Core中,中间件是一种模块化的组件,可以处理HTTP请求和响应。通过在Startup.cs文件中配置中间件,你可以将它们添加到应用程序的请求处理管道中。以下是在ASP.NET Core项目中添加中间件的一般步骤:

  1. 创建ASP.NET Core 项目:首先,创建一个ASP.NET Core项目,可以是空白项目、MVC项目或Web API项目。
  2. 打开Startup.cs文件:在项目中找到Startup.cs文件,这是应用程序的启动类。
  3. Configure方法中添加中间件Configure方法是用于配置HTTP请求管道的地方。在这个方法中,通过使用IApplicationBuilder的方法将中间件添加到管道中。以下是添加一个示例中间件的基本结构:
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {// 其他中间件app.UseMyMiddleware(); // 添加自定义中间件// 其他中间件
    }
    
    上述示例中,UseMyMiddleware是添加自定义中间件的方法。你需要替换它为你要添加的中间件的实际方法。
  4. 配置中间件的顺序和参数:中间件的顺序很重要,因为它决定了它们在管道中执行的顺序。通常,先添加的中间件先执行。某些中间件可能需要配置参数,你可以通过调用相应的配置方法来完成。
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {// 其他中间件app.UseMyMiddleware(); // 添加自定义中间件app.UseStaticFiles(); // 添加静态文件中间件// 其他中间件
    }
    
    在上述示例中,UseStaticFiles是内置的静态文件中间件,被添加在UseMyMiddleware之后。
2.3 示例:使用多个内置中间件构建应用

下面是一个示例,演示如何在ASP.NET Core应用程序中使用多个内置中间件构建一个简单的Web应用。在这个示例中,我们将使用静态文件中间件、身份验证中间件和路由中间件。
首先,确保你已经创建了一个ASP.NET Core项目。以下是一些基本的步骤:

  1. 创建一个新的ASP.NET Core Web应用程序。
  2. 打开Startup.cs文件。
    下面是一个示例,演示如何使用静态文件中间件、身份验证中间件和路由中间件:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;namespace MyWebApp
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }public void ConfigureServices(IServiceCollection services){services.AddAuthentication("MyAuthenticationScheme").AddCookie("MyAuthenticationScheme", options =>{options.LoginPath = "/Account/Login";options.AccessDeniedPath = "/Account/AccessDenied";});services.AddControllersWithViews();}public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");app.UseHsts();}app.UseHttpsRedirection();app.UseStaticFiles(); // 静态文件中间件app.UseRouting(); // 路由中间件app.UseAuthentication(); // 身份验证中间件app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});}}
}

在这个示例中,我们做了以下几件事情:

  1. 身份验证中间件:我们使用了身份验证中间件,并配置了Cookie身份验证方案。在ConfigureServices中,我们添加了身份验证服务,然后在Configure中启用了身份验证中间件。
  2. 路由中间件:我们使用了路由中间件,并在Configure中配置了一个默认的控制器路由。这个路由将匹配控制器、操作方法和可选的参数。
  3. 静态文件中间件:我们使用了静态文件中间件,通过app.UseStaticFiles()来提供静态文件,例如样式表、脚本文件和图像。
  4. 异常处理中间件:在开发环境下,我们使用了开发者异常页,而在生产环境下,我们使用了自定义错误页面并启用了HTTP Strict Transport Security (HSTS)。

这只是一个简单的示例,实际项目中你可能会使用更多的中间件,具体取决于应用程序的需求。通过适当配置和组合内置中间件,你可以构建出功能强大的ASP.NET Core应用程序。

三、最佳实践和注意事项

在使用内置中间件时,遵循一些最佳实践和注意事项可以帮助确保你的ASP.NET Core应用程序的性能、安全性和可维护性。以下是一些建议:

  1. 中间件的顺序很重要
    确保在管道中正确地排列中间件的顺序,因为它们的执行顺序对应用程序的行为有影响。通常,先添加的中间件先执行。例如,静态文件中间件通常应该在MVC路由中间件之前,以确保能够正确处理静态文件的请求。
app.UseStaticFiles(); // 静态文件中间件
app.UseRouting();     // 路由中间件
app.UseEndpoints(...); // MVC路由中间件
  1. 尽量避免过度使用中间件
    不要过度使用中间件。只添加应用程序需要的中间件,避免在管道中引入不必要的复杂性。过多的中间件可能会导致性能下降和难以维护的代码。

  2. 定期更新和维护
    定期检查并更新你的中间件和相关NuGet包,以确保应用程序始终能够受益于最新的性能优化、安全性修复和功能增强。

  3. 安全性配置
    确保按照安全最佳实践配置中间件。例如,在使用静态文件中间件时,确保不向客户端泄漏敏感文件。在使用身份验证中间件时,采用安全的身份验证方案和合适的登录路径和访问拒绝路径。

通过遵循这些最佳实践和注意事项,可以确保你的ASP.NET Core应用程序在性能、安全性和可维护性方面达到最佳状态。

四、总结

ASP.NET Core中的中间件是构建灵活且高效Web应用的关键组件。通过内置中间件,我们能实现静态文件处理、身份验证和路由等核心功能。最佳实践包括正确排列中间件顺序、合理配置异常处理、静态文件和身份验证中间件,并定期维护和更新。这样,我们能够确保应用程序具备良好的性能、安全性和可维护性。通过结合这些中间件,开发者可以构建强大、灵活的ASP.NET Core应用,满足不同场景的需求。

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

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

相关文章

爬虫-6-数据提取-beautifulsoup4

#声明:本文仅供学习。 (●—●)

12.3在应用层使用SPI总线

在SPI总线驱动框架中提供了一个spidev 的字符设备驱动&#xff0c;在应用层可以通过它来访问SPI总线。 应用层访问SPI总线的步骤 编写spidev设备树节点&#xff0c;在SPI总线的设备树节点下添加spidev设备的树节点&#xff0c;设备树示例如下所示&#xff1a; spidev0: spid…

沉浸式webview输入框被输入法遮挡了怎么办?!

还是那个倒霉的双十一需求&#xff0c;测试时发现发弹幕的输入框被系统输入法挡住了&#xff0c;这个问题在之前UC内核的浏览器时没问题啊。经过各种对比定位&#xff0c;发现是因为这次需求还有个沉浸式的实现&#xff0c;就是这个实现导致输入框无法被弹起。所幸看到了Androi…

c++字符串拼接(对标C语言的sprintf)

C语言的sprintf 我们在一些场景下需要先将字符串拼接起来再使用。 如&#xff1a; 我们要输出一个数组中的数据&#xff0c;输出的格式为--第几个数据为什么&#xff1f; 在这种情况下每次输出的字符串都是不一样的&#xff0c;我们可以通过循环来不断增加i的值&#xff0c;通…

“华为杯“第四届中国研究生数学建模竞赛-D题:邮路规划与邮车调度

目录 摘 要&#xff1a; 1.问题的重述 2.模型的假设与符号说明 2.1 针对本问题&#xff0c;本文做出如下假设 2.2 符号说明 3.问题的数学模型 4.问题的求解 4.1 问题一的求解 4.1.1 最少邮车数的求法 4.1.2 邮路规划及路径选择 4.1.3 问题的求解结果 4.2 问题二的求…

隧道应用3-Cobalt Strike正反向连接多层内网

Cobalt Strike 正向连接多层内网&#xff1a; teamserver 不允许访问 B &#xff0c;但是服务器上A有权限&#xff08; A 与 B 在同一网段&#xff09;&#xff0c;若 A 服务上已经有了 cs 的后门&#xff0c;则可以通过 cs 的正向连接去连接 B &#xff0c;在 teamserver 通…

Java 怎么判断对象是否可以被回收?

Java 怎么判断对象是否可以被回收&#xff1f; 在 Java 中&#xff0c;对象的垃圾回收是由垃圾回收器&#xff08;Garbage Collector&#xff09;负责的。判断对象是否可以被回收通常是通过对象的引用计数、可达性分析等机制来完成的。以下是一些判断对象是否可以被回收的方法…

datavrap可视化设计器使用手册

datavrap使用手册 一、产品简介 datavrap是一个动态数据可视化设计器&#xff0c;通过简单配置生成可视化视频&#xff0c;图片和gif。 站长&#xff1a;B站UP&#xff0c;夹克mnnm 这个产品的灵感是在做B站视频时&#xff0c;觉得每次通过修改代码录屏实现视频制作太过于繁琐&…

基于Matlab/Simulink的MIL仿真验证解决方案

文章目录 需求追溯 虚拟环境 模型检查 仿真验证 测试报告 参考文献 针对模型开发阶段的ECU算法&#xff0c;可以很直接地将其与虚拟车辆模型连接起来&#xff0c;通过MIL对其进行验证和确认。可以在开发过程的早期检测到设计错误和不正确的需求&#xff0c;也有助于安全地…

浅析爱泼斯坦事件 —— 弱电控制强电原理

据网络文字与视频资料&#xff0c;爱泼斯坦事件是犹太精英阶层&#xff0c;为了掌控美国国家机器为犹太利益集团服务&#xff0c;而精心设下的一个局。本文先假设这个结论成立&#xff0c;并基于此展开讨论。 我们知道&#xff0c;弱电管理强电是电气工程中的一门专门学问&…

SouthernBiotech抗荧光淬灭封片剂

荧光淬灭又称荧光熄灭或萃灭&#xff0c;是指导致特定物质的荧光强度和寿命减少的所有现象。引起荧光淬灭的物质称为荧光淬灭剂。SouthernBiotech专门开发的Fluoromount-G系列荧光封片剂是以甘油为基础&#xff0c;加入抗荧光淬灭剂&#xff0c;可明显降低荧光淬灭现象&#xf…

【工具】tmux简单用法

tmux 是一个终端复用工具&#xff0c;允许你在单个终端窗口中运行多个终端会话&#xff0c;并在它们之间切换。它提供了分割窗格、多窗口和会话管理等功能&#xff0c;使得在终端中更加高效地工作。 以下是一些 tmux 的基本概念和简单应用&#xff1a; 会话 (Session): 一个 t…

天津python培训学校 Python有怎样的前景?

很多人以为Python之所以变得火热的原因是人工智能和大数据的兴起&#xff0c;这并非是全部的原因&#xff0c;Python是一门很适合人工智能领域的编程语言&#xff0c;人工智能目前虽然还处于前期阶段&#xff0c;但是对人工智能方面的人才确在不断增加&#xff0c;能够提供的岗…

mysql数据库优化

数据库的性能调优和优化是指通过优化数据库结构、SQL语句的编写以及服务器硬件和操作系统等方面的配置&#xff0c;来提高数据库的响应速度和稳定性&#xff0c;以满足业务需求。 结合实际需求&#xff0c;从以下四个方面进行讲解。 一、数据库设计优化 二、SQL语句优化 三、…

为什么很多公司选择不升级JDK版本,仍然使用JDK8?

在讨论为什么许多公司选择不升级JDK版本&#xff0c;而继续使用JDK 8时&#xff0c;我们需要从多个角度来分析这个问题。以下是根据您提供的背景信息进行的一些分析和真实案例。 本文已收录于&#xff0c;我的技术网站 ddkk.com&#xff0c;有大厂完整面经&#xff0c;工作技术…

[易语言]易语言调用C++ DLL回调函数

易语言适合用于数据展示&#xff0c;数据的获取还是VC来的快、方便哈。 因此我一般使用VC编写DLL&#xff0c;使用易语言编写界面&#xff0c;同一个程序&#xff0c;DLL和EXE通讯最方便的就是使用接口回调了。 废话少说&#xff0c;进入主题。 1. VC编写DLL 为了DLL能够调…

软件测试作业‖若依系统的自动化+性能

以若依系统或者任意系统作为案例&#xff0c;题目:以某一 web系统为测试对象&#xff0c;完成以下文档的编写: (1)产品规格说明书(SPEC) 要求:功能完整(完成产品需求70%以上)、UI优良(每个页 面均有字段约束和合理的出错提示)、流程完整(一一对应功能)、流程合理(处理逻辑非…

用python实现删除照片中的物体

要使用Python删除照片中的物体&#xff0c;你可以使用图像处理库&#xff0c;如OpenCV和PIL&#xff08;Python Imaging Library&#xff09;。以下是一个简单的示例&#xff0c;演示如何使用OpenCV和PIL删除照片中的特定物体。 首先&#xff0c;确保你已经安装了OpenCV和PIL库…

C //练习 5-16 增加选项-d(代表目录顺序)。该选项表明,只对字母、数字和空格进行比较。要保证该选项可以和-f组合在一起使用。

C程序设计语言 &#xff08;第二版&#xff09; 练习 5-16 练习 5-16 增加选项-d&#xff08;代表目录顺序&#xff09;。该选项表明&#xff0c;只对字母、数字和空格进行比较。要保证该选项可以和-f组合在一起使用。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不…

什么类型的企业需要工单系统?适用场景与优势分析

在现代商业中&#xff0c;必须高效地管理与跟踪大量任务和工作流程。对一些企业而言&#xff0c;处理很多订单是一项具有挑战性的任务。此订单可能来自客户需求、内部问题反馈或各种业务流程中的任务分配。可是&#xff0c;如果没有好的解决方法&#xff0c;这类订单可能会致使…