C# MVC中的ActionFilter和Authorize属性导致对象引用错误
我正在使用C# MVC中的ActionFilter和Authorize属性导致对象引用错误,c#,asp.net-mvc,controller,action-filter,authorize-attribute,C#,Asp.net Mvc,Controller,Action Filter,Authorize Attribute,我正在使用MVC4构建ASP.NET应用程序。我正在业务逻辑中使用actionfilteratAttribute和AuthorizeAttribute。下面是示例代码 控制器类 [SessionExpire] [AuthorizeSubscription] public class StoreController : Controller { public ActionResult StoreDetail() { // My logic goes here
MVC4
构建ASP.NET
应用程序。我正在业务逻辑中使用actionfilteratAttribute
和AuthorizeAttribute
。下面是示例代码
控制器类
[SessionExpire]
[AuthorizeSubscription]
public class StoreController : Controller
{
public ActionResult StoreDetail()
{
// My logic goes here
}
[AuthorizeProductEdit]
[HttpGet]
public ActionResult EditProduct()
{
// My logic goes here
}
如果我们看一下代码,我首先使用了继承actionfilteratAttribute
类的SessionExpire
属性,它检查session
是否对当前请求有效,并在那里执行一些重定向。接下来,我检查继承AuthorizeAttribute
类的AuthorizeSubscription
属性。它还根据上面写的逻辑执行一些重定向
在EditProduct
操作中,我使用了另一个AuthorizeAttribute
如果我点击StoreDetail
操作的url而不进行任何会话
,它会将我重定向到所需页面
但如果我点击EditProduct
操作的url,它会抛出对象引用错误
。在调试过程中,它首先进入AuthorizeProdcutEdit
的代码中,并且无法找到会话
Null
为什么不先执行SessionExpire代码,如果发现Session为空,则从那里退出?根据,筛选属性的顺序首先由其类型(例如授权筛选器、操作筛选器等)确定,然后由其范围(例如控制器范围、操作范围)确定
您的SessionExpire
属性具有类型Action、scope Controller。
您的authorizedProductEdit
属性具有类型授权、范围操作
这就是为什么您的authorizedProductEdit
属性首先出现的原因。来自(我的重点)
ASP.NET MVC框架支持四种不同类型的过滤器:
授权筛选器–实现IAuthorizationFilter属性
动作过滤器–实现IActionFilter属性
结果过滤器–实现IResultFilter属性
异常过滤器–实现IEExceptionFilter属性
过滤器按上面列出的顺序执行。例如,授权筛选器总是在操作筛选器之前执行,异常筛选器总是在其他类型的筛选器之后执行
Per:
过滤器按以下顺序运行:
SessionExpire
属性在AuthorizeSubscription
属性之后激发的原因是MVC总是首先激发授权过滤器
因此,要解决这个问题,您需要使用SessionExpire
来实现iaauthorizationfilter
(并可能继承属性
)
此外,您还需要这样做,因为.NET framework不能保证它们的处理顺序
[SessionExpire(Order=1)]
[AuthorizeSubscription(Order=2)]
public class StoreController : Controller
{
// Remaining implementation...
请注意,最好的方法是注册,这既允许它们对DI友好,也允许您通过按特定顺序全局注册筛选器来显式设置顺序。您是否记得注册操作筛选器?我的问题是,为什么它首先执行
AuthorizeProductEdit
代码。相反,它应该先执行SessionExpire
code,因为它应用于controller
本身