我正在使用MVC4生成ASP.NET应用程序。我在业务逻辑中使用ActionFilterAttributeAuthorizeAttribute。以下是示例代码

控制器类

[SessionExpire]
[AuthorizeSubscription]
public class StoreController : Controller
{
    public ActionResult StoreDetail()
    {
       // My logic goes here
    }

    [AuthorizeProductEdit]
    [HttpGet]
    public ActionResult EditProduct()
    {
       // My logic goes here
    }


如果看一下代码,我首先使用了继承SessionExpire类的ActionFilterAttribute属性,它检查session是否对当前请求有效,并在那里进行一些重定向。接下来,我正在检查继承AuthorizeSubscription类的AuthorizeAttribute属性。它还根据那里写的逻辑进行一些重定向。

EditProduct动作中,我使用了另一个AuthorizeAttribute

如果我在没有进行任何StoreDetail的情况下点击session操作的url,它会将我重定向到所需的页面。

但是,如果我点击EditProduct动作的网址,就会抛出Object Reference error。在调试过程中,它首先进入AuthorizeProdcutEdit的代码,而找不到Session空。

为什么它不先执行SessionExpire代码,如果找到Session Null则从那里退出?

最佳答案

根据MSDN


  筛选器按以下顺序运行:
  
  
  授权过滤器
  动作过滤器
  响应过滤器
  异常过滤器
  


您的SessionExpire属性在您的AuthorizeSubscription属性之后触发的原因是,MVC始终首先触发授权过滤器。

因此,要解决该问题,您需要使用SessionExpire来实现IAuthorizationFilter(并且大概继承了Attribute)。

另外,您将需要set the order of your attributes,因为.NET框架不保证将以什么顺序处理它们。

[SessionExpire(Order=1)]
[AuthorizeSubscription(Order=2)]
public class StoreController : Controller
{
   // Remaining implementation...


请注意,最好的方法是separate your filters from your attributes,它既允许它们对DI友好,也允许您通过以特定顺序全局注册过滤器来显式设置顺序。

关于c# - MVC中的ActionFilter和Authorize Attribute导致对象引用错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35453485/

10-10 11:17