我正在asp.net MVC3中开发一个应用程序,我有以下问题: 我应该何时编写HTTP模块,何时应该编写动作过滤器?
答案 0 :(得分:30)
过滤器是更多的MVC做事方式而Http模块更多是ASP.NET做事的方式。两者都通过在处理管道中提供钩子来达到类似的目的。
HttpModule更通用,当您希望在每个请求上处理某些事情时。过滤器可用于添加特定于操作的行为。
如果您希望每个Http请求只执行一次操作,则应使用HttpModule。在请求期间,ActionFilter可能会多次执行,除非您检查IsChildActionOn。
答案 1 :(得分:8)
HttpModule 。它们旨在使开发人员能够拦截,参与或修改每个请求。可以订阅22个可用事件,使模块能够在流程的各个阶段处理请求。这些事件对于希望在引发关键请求管道事件时运行代码的页面开发人员非常有用。如果您正在开发自定义模块并且希望为管道的所有请求调用模块,它们也很有用。
过滤器旨在在MVC请求生命周期之间注入逻辑。特别是在调用de动作之前和之后,以及在处理结果之前和之后。过滤器为用户提供了强大的方法来检查,分析,捕获和监控MVC项目中的一些事情。从MVC5开始,有5种类型的过滤器:
因此,如果您想在特定的22 events in the http request pipeline中拦截,参与或修改模块。如果您的逻辑与操作方法严格相关,则最好是服务器覆盖以下ActionFilterAttribute方法之一:
答案 2 :(得分:2)
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路由和动作方法之间的抽象层。使用动作过滤器,我们可以将相同的逻辑应用于多个控制器或动作方法。例如,自定义日志记录。