在MVC网站的HttpModule中使用重定向,道路

本文关键字:重定向 道路 MVC 网站 HttpModule | 更新日期: 2023-09-27 18:09:02

过去:

我们使用Response。重定向,它设置302响应头并引发ThreadAbortException以防止重定向后发生其他任何事情。

现在,使用MVC:

我们返回一个RedirectResult,这避免了ThreadAbortException的性能问题,也允许管道的其余部分在实际将结果发送回浏览器之前检查结果。这是考虑重定向的另一种方式——现在重定向不是停止执行,而是更像是从函数返回。

我的问题与混合和匹配这些模式有关。

这是要求。我们有一个MVC站点,该站点包含一个负责身份验证的HttpModule。如果身份验证出现任何问题,它会丢弃cookie并将其重定向到外部网页。因此,HttpModule决定是发送重定向头还是将控制权传递给MVC站点。如果它发送重定向头,它必须停止执行——如果身份验证失败,我们不希望以任何方式、形状或形式访问该站点。

什么是"正确"的方法?HttpModule应该简单地使用Response。像以前一样重新定位吗?或者有一些更聪明的方法来实现这一点,更符合MVC模式?HttpModule有没有办法告诉管道停止处理?

或者我应该使用一些完全不同的模式,不使用HttpModule的东西?也许是MVC过滤器?问题是,模块和站点本身之间的模块化/关注点分离是非常重要的。有人有什么建议吗?

在MVC网站的HttpModule中使用重定向,道路

我想我应该把答案放在这里,以防其他人在类似的问题领域有问题。

答案其实很简单。

HttpContext.ApplicationInstance.CompleteRequest()

上面的调用不再抛出ThreadAbortException(这在。net 2.0中改变了),所以你可以安全地使用它来告诉管道停止执行。当HttpModule退出时,网站被绕过,控制权直接转到EndRequest——这正是我所需要的。这在。net 1.1中是不可能的,但我不认为有很多1.1 MVC项目;)

既然您提到这是用于身份验证,那么您应该使用Authorize属性。您可以在类级别或操作级别使用它。

[Authorize]
public class HomeController : Controller
{
    // All actions will require authorization
}
public class ImageController : Controller
{
    public ActionResult PublicImage()
    {
    }
    [Authorize]
    public ActionResult ImageRequiringAuth()
    {
    }
}

对于您的用例,您可能需要从AuthorizationAttribute继承,如本回答中所述。