在 ASP.NET Core 中,builder.Services.AddControllersWithViews
是一个用于配置应用程序以支持 MVC(Model-View-Controller)模式的扩展方法。它通常在应用程序的启动配置文件中使用,例如 Program.cs
或 Startup.cs
。这个方法的作用是注册 MVC 控制器和视图所需的依赖项和服务。
在 ASP.NET Core 中,使用 builder.Services.AddControllersWithViews(options => {...})
方法配置 MVC 控制器和视图时,可以通过 options.Filters.Add
添加全局过滤器。过滤器是 ASP.NET Core MVC 中用于在请求处理管道的特定阶段执行代码的组件。它们可以用于执行诸如日志记录、异常处理、授权检查等跨多个控制器和操作的通用逻辑。
以下是一些常见的过滤器类型和如何添加它们的示例:
常见过滤器类型
-
授权过滤器(Authorization Filters):用于检查用户是否具有执行特定操作的权限。
csharpoptions.Filters.Add(new AuthorizeAttribute());
-
异常过滤器(Exception Filters):用于捕获并处理操作执行过程中发生的异常。
csharpoptions.Filters.Add(new ExceptionFilterAttribute());
-
操作过滤器(Action Filters):在操作执行前后执行代码。
csharpoptions.Filters.Add(new MyActionFilter());
-
结果过滤器(Result Filters):在操作结果生成前后执行代码。
csharpoptions.Filters.Add(new MyResultFilter());
示例代码
以下是一个完整的示例,展示如何在 Program.cs
中配置全局过滤器:
var builder = WebApplication.CreateBuilder(args);
// 添加控制器和视图支持,并配置全局过滤器
builder.Services.AddControllersWithViews(options =>
{
// 添加全局授权过滤器
options.Filters.Add(new AuthorizeAttribute());
// 添加自定义操作过滤器
options.Filters.Add(new MyActionFilter());
// 添加异常过滤器
options.Filters.Add(new ExceptionFilterAttribute());
});
var app = builder.Build();
// 配置中间件管道
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
app.Run();
// 自定义操作过滤器示例
public class MyActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// 在操作执行前执行的代码
Console.WriteLine("Action is about to execute.");
}
public void OnActionExecuted(ActionExecutedContext context)
{
// 在操作执行后执行的代码
Console.WriteLine("Action has been executed.");
}
}
解释
- AuthorizeAttribute:这是一个内置的授权过滤器,用于要求用户必须经过身份验证才能访问控制器或操作.
- MyActionFilter:这是一个自定义的操作过滤器,实现了
IActionFilter
接口。它在操作执行前后分别输出日志信息. - ExceptionFilterAttribute:这是一个内置的异常过滤器,用于捕获和处理操作执行过程中发生的异常.
通过在 AddControllersWithViews
方法中添加全局过滤器,你可以确保所有控制器和操作都会执行这些过滤器中的逻辑,从而实现代码的复用和统一的处理逻辑.
1. AddControllersWithViews(options => {...})
- 作用:配置 MVC 控制器和视图支持。
AutoValidateAntiforgeryTokenAttribute
:这是一个过滤器,用于自动验证 POST 请求中的防伪造令牌。防伪造令牌用于防止跨站请求伪造(CSRF)攻击,确保只有来自同一站点的请求才能被处理。AddSessionStateTempDataProvider
:此方法用于配置临时数据提供者,以便在使用TempData
时使用会话状态来存储数据。这对于跨请求存储少量数据非常有用。AddRazorRuntimeCompilation
:启用 Razor 视图的运行时编译。这意味着在应用程序运行时对视图文件的更改将立即生效,而无需重新编译整个应用程序。这对于开发阶段非常有用,但在生产环境中可能会增加性能开销。通常需要在项目文件中进行相应的配置,例如设置RazorCompileOnBuild
为false
以确保在开发时启用运行时编译。
2. AddRazorPages()
- 作用:配置 Razor Pages 支持。
- Razor Pages:这是一种页面模型,用于构建简单的页面,适合不需要复杂控制器逻辑的场景。它将页面的逻辑和视图紧密集成在一起,简化了页面的开发过程。
注意事项
- 性能考虑:启用运行时编译(
AddRazorRuntimeCompilation
)会增加应用程序的启动时间和运行时开销,因此在生产环境中通常不推荐使用。可以通过在项目文件中配置来控制其行为. - 安全性:使用
AutoValidateAntiforgeryTokenAttribute
是一个很好的安全实践,确保 POST 请求的安全性. - 会话状态:使用会话状态存储
TempData
时,需要注意会话的生命周期和性能影响,尤其是在高并发的应用场景中.
- 性能考虑:启用运行时编译(