2013-04-03 38 views
3

我有一個自定義IHttpModule,我只想在特定的路由上工作。HttpModule只在特定的MVC路由

例如:http://example.com/HandleAzureTask

我想這個模塊時才調用/在/HandleAzureTask路線上進行處理。

由於這不是控制器,所以我無法真正設置[Authorize]屬性;我如何強制它只被調用/處理,如果用戶通過身份驗證?

我在ASP.NET MVC 4,目前已經加入到web.config中我的模塊,例如:

<modules> 
    <remove name="AzureWebDAVModule" /> 
    <add name="AzureWebDAVModule" type="VMC.WebDAV.Azure.Module.AzureWebDAVModule, VMC.WebDAV.Azure.Module" /> 
</modules> 
+0

我建議創建自定義路由約束這條路... – 2013-04-06 15:44:10

+0

什麼是你的HttpModule做什麼?如果您僅在此ASP.NET MVC應用程序上使用此模塊,則可以考慮將其重寫爲操作篩選器。 – StockBreak 2013-04-06 16:33:47

+0

我有一個處理Office應用程序和Azure Blob存儲之間交互的WebDav服務器IHttpModule。 – dotsa 2013-04-07 22:19:16

回答

5

的HttpModules被稱爲在每次請求(HttpHandlers的,而是可以被過濾)。如果你只是想只對選定的路線執行你的任務,你可以做到以下幾點:

設置這樣的路線:

routes.MapRoute(
    name: "AzureWebDAVRoute", 
    url: "HandleAzureTask", 
    // notice the enableHandler parameter 
    defaults: new { controller = "YourController", action = "YourAction", enableHandler = true } 
); 

在你的模塊:

public class AzureWebDAVModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     // you can't directly access Request object here, it will throw an exception 
     context.PostAcquireRequestState += new EventHandler(context_PostAcquireRequestState); 
    } 

    void context_PostAcquireRequestState(object sender, EventArgs e) 
    { 
     HttpApplication context = (HttpApplication)sender; 
     RouteData routeData = context.Request.RequestContext.RouteData; 

     if (routeData != null && routeData.Values["enableHandler"] != null) 
     { 
      // do your stuff 
     } 
    } 

    public void Dispose() 
    { 
     // 
    } 
} 

現在您的任務將僅在選定的路線上執行。請注意,您需要參數,因爲您無法通過名稱找到當前路線。

+0

盧卡,這是否意味着我必須有一個實際的控制器?如果是,我是否在控制器上設置了[授權]標籤?如果沒有,我將如何去添加[授權]標籤到「HandleAzureTask」控制器,在路由級別通過自定義過濾器?所以,基本上HttpModule在每次加載時都會被調用,但只會在routeData.Values [「enableHandler」]!= null時纔會起作用。我將其用於WebDav文件存儲,但實際文件存儲在Azure Blob中。 – dotsa 2013-04-07 22:14:38

+0

@dotsa'[Authorize]'屬性在這裏影響不大,因爲HttpModule將被稱爲**。如果你想過濾訪問你的模塊,你可以添加一個'Request.IsAuthenticated'條件。問題是你正在使用HttpModule,並且這些組件被集成到ASP.NET管道中。請注意,與模塊不同,[HttpHandlers](http://msdn.microsoft.com/zh-cn/library/aa903367(v = vs.71).aspx)可以支持路徑參數。 – StockBreak 2013-04-08 16:57:32

+0

在這種情況下控制器的必要性是什麼。我也可以過濾IHttpModule中的url參數,如果它包含「HandleAzureTask」,那麼句柄將執行它的操作。我錯過了什麼嗎?或者通過使用Controller,我們可以添加[Authorize]屬性? – dotsa 2013-04-11 20:47:47

0

爲什麼不只是創建一個普通的文件夾namned/HandleAzureTask,並將該模塊註冊的文件夾內放置一個單獨的web.config。

然後模塊將運行該文件夾中的所有請求。

獲取授權工作,你還可以設置權限元素在web.config中不允許*