我正在使用MVC4
生成ASP.NET
应用程序。我在业务逻辑中使用ActionFilterAttribute
和AuthorizeAttribute
。以下是示例代码
控制器类
[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/