
在ASP.NET Core开发领域,中间件扮演着至关重要的角色,它是构建高效、灵活Web应用的关键组件。理解ASP.NET Core中间件的工作原理、执行机制以及如何正确使用它,对于开发者优化Web应用性能、实现复杂功能至关重要。
HttpContext)和一个指向管道中下一个中间件的委托。中间件可以选择将请求传递给下一个中间件,也可以直接生成响应并结束管道。public class SampleMiddleware
{
private readonly RequestDelegate _next;
public SampleMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// 中间件逻辑
Console.WriteLine("SampleMiddleware处理请求前");
await _next(context);
Console.WriteLine("SampleMiddleware处理响应后");
}
}
// 扩展方法,用于将中间件添加到管道
public static class SampleMiddlewareExtensions
{
public static IApplicationBuilder UseSampleMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<SampleMiddleware>();
}
}在上述代码中,SampleMiddleware构造函数接收RequestDelegate,它指向管道中的下一个中间件。InvokeAsync方法包含中间件的处理逻辑,在调用_next(context)时,将请求传递给下一个中间件。
2. 执行流程:当一个HTTP请求到达应用程序时,它首先进入管道的第一个中间件。该中间件执行自己的逻辑,然后决定是否将请求传递给下一个中间件。如果传递,下一个中间件重复此过程,直到请求到达管道的末尾。响应则沿着相反的方向返回,每个中间件在响应返回时可以再次执行一些逻辑。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace MiddlewareExample
{
public class LoggingMiddleware
{
private readonly RequestDelegate _next;
public LoggingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
Console.WriteLine("请求开始处理");
await _next(context);
Console.WriteLine("请求处理结束");
}
}
public static class LoggingMiddlewareExtensions
{
public static IApplicationBuilder UseLoggingMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<LoggingMiddleware>();
}
}
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseLoggingMiddleware();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello, World!");
});
}
}
}LoggingMiddleware中间件在请求处理前输出“请求开始处理”,在请求传递给下一个中间件并处理完成后输出“请求处理结束”。Startup类的Configure方法中使用UseLoggingMiddleware将中间件添加到管道,最后通过app.Run设置应用程序的终端中间件,返回“Hello, World!”响应。using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace MiddlewareExample
{
public class AuthenticationMiddleware
{
private readonly RequestDelegate _next;
public AuthenticationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
if (!context.Request.Headers.TryGetValue("Authorization", out var token))
{
context.Response.StatusCode = 401;
await context.Response.WriteAsync("未提供令牌");
return;
}
if (token!= "valid - token")
{
context.Response.StatusCode = 403;
await context.Response.WriteAsync("令牌无效");
return;
}
await _next(context);
}
}
public static class AuthenticationMiddlewareExtensions
{
public static IApplicationBuilder UseAuthenticationMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<AuthenticationMiddleware>();
}
}
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseAuthenticationMiddleware();
app.Run(async (context) =>
{
await context.Response.WriteAsync("身份验证通过");
});
}
}
}AuthenticationMiddleware中间件从请求头中获取Authorization令牌,检查令牌是否存在且有效。如果令牌无效,返回相应的错误状态码和信息。如果有效,则将请求传递给下一个中间件。Startup类中添加身份验证中间件,终端中间件在身份验证通过后返回“身份验证通过”。Authorization令牌或令牌无效时,浏览器显示相应的错误信息;当令牌有效时,浏览器显示“身份验证通过”。using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace MiddlewareExample
{
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
context.Response.StatusCode = 500;
await context.Response.WriteAsync($"发生错误: {ex.Message}");
}
}
}
public static class ErrorHandlingMiddlewareExtensions
{
public static IApplicationBuilder UseErrorHandlingMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ErrorHandlingMiddleware>();
}
}
public class AuthenticationMiddleware
{
private readonly RequestDelegate _next;
public AuthenticationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
if (!context.Request.Headers.TryGetValue("Authorization", out var token))
{
throw new Exception("未提供令牌");
}
if (token!= "valid - token")
{
throw new Exception("令牌无效");
}
await _next(context);
}
}
public static class AuthenticationMiddlewareExtensions
{
public static IApplicationBuilder UseAuthenticationMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<AuthenticationMiddleware>();
}
}
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseErrorHandlingMiddleware();
app.UseAuthenticationMiddleware();
app.Run(async (context) =>
{
await context.Response.WriteAsync("身份验证通过");
});
}
}
}using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace MiddlewareExample
{
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
context.Response.StatusCode = 500;
await context.Response.WriteAsync($"发生错误: {ex.Message}");
}
}
}
public static class ErrorHandlingMiddlewareExtensions
{
public static IApplicationBuilder UseErrorHandlingMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ErrorHandlingMiddleware>();
}
}
public class AuthenticationMiddleware
{
private readonly RequestDelegate _next;
public AuthenticationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
if (!context.Request.Headers.TryGetValue("Authorization", out var token))
{
throw new Exception("未提供令牌");
}
if (token!= "valid - token")
{
throw new Exception("令牌无效");
}
await _next(context);
}
}
public static class AuthenticationMiddlewareExtensions
{
public static IApplicationBuilder UseAuthenticationMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<AuthenticationMiddleware>();
}
}
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseAuthenticationMiddleware();
app.Run(async (context) =>
{
await context.Response.WriteAsync("身份验证通过");
});
app.UseErrorHandlingMiddleware();
}
}
}Startup类中,先添加身份验证中间件,再添加错误处理中间件,确保身份验证失败的异常能够正确被错误处理中间件捕获和处理。HttpContext.Items字典在中间件之间共享数据。例如,一个中间件可以在HttpContext.Items中设置一个值,后续的中间件可以从HttpContext.Items中获取该值。ASP.NET Core中间件是构建高效Web应用的核心组件,其核心在于管道模型和委托链的实现。适用于各种Web应用场景,能够实现功能扩展、请求处理优化等。随着ASP.NET Core的发展,中间件的功能和性能有望进一步提升,为开发者提供更强大的Web开发能力。