0

我正在實現從AuthorizeAttribute繼承的自定義授權過濾器。經過我的研究,我發現動作過濾器被緩存,因此它們只被實例化一次。對不同動作的相同動作過濾器

這是我的問題。如果我實現並使用像下面這樣的自定義操作過濾器,它不應該正常工作,因爲它將被實例化一次,並且從不再次調用構造函數。但是當我測試時,它運行良好所以我想我有些東西我不知道。

任何人都可以清楚地解釋這個(動作過濾器生命週期?)嗎?

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    private readonly string value = string.Empty; 

    public CustomAuthorizeAttribute(string value) 
    { 
    this.value = value; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
    // Do something with this.value 
    } 
} 

public class HomeController : Controller 
{ 
    [CustomAuthorize("ACCESS_INDEX")] 
    public ActionResult Index() 
    { 
    } 

    [CustomAuthorize("ACCESS_LOGIN")] 
    public ActionResult Login() 
    { 
    } 
} 
+0

您正在使用哪個版本的MVC? – thepirat000

+0

@ thepirat000它是mvc3。 – user3110409

+0

在CustomAuthorizeAttribute構造函數中放置一個斷點,您將看到它被兩次調用兩次,即索引和登錄,但隨後對索引和登錄的任何後續請求都不會在緩存中達到中斷點,因此它們會根據控制器操作緩存或者你可以說,如果在10動作中使用動作屬性,那麼該動作屬性將有最多10個實例。 – madan

回答

0

這個網站有頁面生命週期的MVC一個很好的概述

http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx

的原因,你的測試顯示運行所有的時間過濾器,因爲當過一個路由是從所謂的URL MVC將其與控制器匹配,然後在該控制器中執行操作。其中一個動作是MVC發現它有一個動作過濾器,並首先執行動作過濾器。如果在同一控制器中同時調用兩個操作(來自兩個不同的Web用戶),則會調用控制器的兩個唯一實例,以便一個實例不知道另一個實例已運行過濾器。

+0

感謝您的回答,但我沒有明確您的觀點,並且從該鏈接找不到任何線索(儘管這是一篇很好的文章。)無論如何,我的問題不是關於控制器的生命週期,而是關於生命週期的行動過濾器。我所知道的是動作過濾器被緩存,所以它只實例化一次。 (這意味着它的構造函數只被調用一次,所以內部變量不能被改變。)這是我的理解,但是我的測試證明它是錯誤的。那麼我錯過了什麼? – user3110409

+0

據我所知,過濾器沒有緩存在客戶端,代碼被編譯,並且編譯後的代碼被緩存,就像控制器代碼一樣,但是變量在過濾器執行完成後被丟棄。 – Matthew

2

不要這樣做。

根據我自己的經驗,在Action上使用私有變量是不可靠的,即使它有時看起來有效,你最終可能會得到一些非決定性的結果。

看到,您的代碼可能對1個請求正常工作,但在同時處理多個請求時根本無法工作。

該用戶的問題,聲稱完全相反的經驗,當你:How to use ActionFilterAttribute to log running times?

我唯一的解釋是,如果操作調用程序實例的行爲過濾器,並且:它不把它周圍很長,或它創建一個實例池(或兩者)。

我有一個原型,保持上下文作爲私人訴訟財產,它偶爾會(不是每個時間)均與併發使用擲EF錯誤(這是爲EF一個問題。)

這告訴我,我的動作被同時使用多次。

我會建議一個人將他們的行爲集中在過濾器上下文中。過濾器上下文包含此時正在進行的所有操作。在MVC中,您可以使用filterContext.HttpContext.Items來存儲正在用於此特定請求的項目。 (請參閱Accessing Action Filter's data in Controller Action

最後,還可能發現不同版本的MVC框架以不同方式優化操作過濾器的生命週期。

一對夫婦的話題有用的鏈接:

一些細節上的一般MVC生命週期 http://blog.christopheargento.net/2012/06/11/detailed-life-cycle-of-an-asp-net-mvc-request/

在談到如何創建動態動作過濾器(編程方式插入,改變上飛) Dino Esposito調查一些正在進行的工作 https://msdn.microsoft.com/en-us/magazine/gg309182.aspx

自定義動作過濾器和多個存在時的過濾器訂單 http://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-custom-action-filters

相關問題