2013-04-03 24 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中不允许*