我正在用 asp.net MVC3 开发一个应用程序,我有以下问题:什么时候应该写一个 HTTP 模块,什么时候应该写一个动作过滤器?
3 回答
过滤器是更多的 MVC 做事方式,而 Http Module 是更多的 ASP.NET 做事方式。两者都通过在处理管道中提供挂钩来达到类似的目的。
HttpModule 更通用,当您希望在每个请求上处理某些事情时。过滤器对于添加特定于操作的行为很有用。
如果您希望每个 Http 请求仅执行一次某些操作,则应使用 HttpModule。ActionFilter 可能会在请求期间执行多次,除非您检查 IsChildActionOn。
HttpModule在请求处理程序执行之前和之后被调用。它们旨在使开发人员能够拦截、参与或修改每个请求。可以订阅 22 个可用事件,使模块能够在流程的各个阶段处理请求。这些事件对于希望在引发关键请求管道事件时运行代码的页面开发人员很有用。如果您正在开发自定义模块并且希望针对管道的所有请求调用该模块,它们也很有用。
过滤器旨在在 MVC 请求生命周期之间注入逻辑。特别是在调用 de 动作之前和之后,以及在处理结果之前和之后。过滤器为用户提供了强大的方法来检查、分析、捕获和检测 MVC 项目中发生的一些事情。从 MVC5 开始,有 5 种类型的过滤器:
- 验证
- 授权
- 行动
- 结果
- 例外
因此,如果您想拦截、参与或修改http 请求管道中的 22 个事件中的特定事件,请选择modules。如果您的逻辑与操作方法严格相关,则最好在服务器上覆盖以下 ActionFilterAttribute 方法之一:
- OnAction执行
- OnActionExecuted
- OnResultExecuting
- OnResultExecuted
HttpModule是 IIS 允许 Web 应用程序通过让您将事件处理程序附加到HttpApplication事件来覆盖默认行为或添加自定义逻辑的方式。不同的 IIS 模式(集成或经典)甚至使用有不同的 Web.config 设置。
参考: http:
//msdn.microsoft.com/en-us/library/ms227673 (v=vs.100).aspx
示例:将非 www 重定向到 www URL
public void Init(HttpApplication application)
{
application.PreRequestHandlerExecute += this.Application_PreRequestHandlerExecute;
}
private void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
Uri requestUrl = HttpContext.Current.Request.Url;
string host = requestUrl.Authority.ToLower();
if (!host.StartsWith("www"))
{
HttpContext.Current.Response.Redirect(requestUrl.Scheme + "://www." + host + requestUrl.PathAndQuery);
HttpContext.Current.Response.End();
}
}
动作过滤器是装饰控制器或动作方法的属性。它是 MVC 路由和操作方法之间的抽象层。使用动作过滤器,我们可以将相同的逻辑应用于多个控制器或动作方法。例如,自定义日志记录。