2013-01-07 60 views
2

正常情況下,自System.Attribute,在通常aspx文件,我可以在網頁的開頭使用System.Attribute,如:如何運行在一個ASHX文件

[AuthorizePage()] 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
     } 
    } 

    public class AuthorizePage : System.Attribute 
    { 
     public AuthorizePage() 
     { 
      //do some stuff to authorize 
     } 
    } 

和頁面之前初始化屬性的構造函數運行並執行一些操作以確保當前登錄的人員,否則屬性構造函數會將用戶重定向到登錄頁面。

我想做一個HttpHandlerashx文件)相同,但屬性從未初始化ashx的頁面上時。

[AuthorizePage()] 
public class AjaxHandler : MuCustomClassBase, IHttpHandler, IReadOnlySessionState 
{ 
    //The interface implementations and some other custom private methods 
} 

我對這個ashx頁面做一個AJAX調用。這可能是屬性不運行的原因嗎?還是我必須知道的其他任何事情?

最後,我將非常高興知道如何在一個ASHX文件運行自定義System.Attribute?

+3

你試圖重新發明ASP.Net MVC。 – SLaks

回答

1

那麼首先是你正在改造中Asp.Net MVC的ActionFilterAttribute的。但是,我必須問你是否真的需要使用屬性?我建議你使用繼承模型。讓我簡單解釋一下;您可能有一個實現安全操作的SecurePage:Page類。然後您可以傳遞與衍生頁面相關的安全代碼。

如果你堅持使用屬性,你應該寫一個基地工廠處理程序路由到需要處理交叉處理機制。這個處理程序應該像中介對象一樣工作。

2

屬性不會自己做任何事情。你可以在課堂上堆放10個隨機屬性,而不會發生任何事情。屬性只是提供關於類/方法/屬性的元數據。

應該有一段代碼,着眼於元數據,並採取行動。由於您似乎正在使用自定義AuthorizePageAttribute這樣的代碼片段不是爲處理程序運行,也不是指望從Page派生的類不具有此類屬性。

要解決,你需要查找處理您的自定義屬性並解決它的問題。您可能需要直接向您的處理程序添加類似的代碼。

,你在屬性的構造函數代碼做了一個頁面類可用在每次請求該網頁時,其實聽起來很可疑 - 我期望每個類型實例被創建一次這樣的屬性。依靠屬性的構造函數中的非平凡代碼來運行該類的每個實例對我來說似乎很危險。

3

假設你正在使用ASP.Net身份驗證,可以將ashx的只是添加到web.config中和IIS/ASP.Net保護的頁面的列表將其餘的工作:

<location path="AjaxRequests.ashx"> 
    <system.web> 
     <authorization> 
     <allow users="?" /> 
     </authorization> 
    </system.web> 
    </location> 

如果您使用的是自建身份驗證方案,則可以覆蓋OnProcessRequest並在該方法中執行必要的身份驗證,然後根據需要重定向。

+0

非常感謝。但是,似乎我忘了提到這一點。我使用我自己的認證系統。但是,再次感謝您的意見。 –

+1

我想這可能是這樣的;在這種情況下,我建議您將驗證代碼添加到OnProcessRequest。如果你有多個ashx頁面,你可以創建一個他們繼承的基類,它總是執行認證(這就是我們的應用程序結構)。 –

相關問題