Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC中的ActionFilter和Authorize属性导致对象引用错误_C#_Asp.net Mvc_Controller_Action Filter_Authorize Attribute - Fatal编程技术网

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
    本身