HttpModule仅适用于特定的MVC路由

时间:2013-04-03 21:51:13

标签: asp.net-mvc asp.net-mvc-4 routes httpmodule

我有一个自定义IHttpModule,我只想在特定路线上工作。

例如: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>

2 个答案:

答案 0 :(得分: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()
    {
        //
    }
}

现在,您的任务将仅在所选路线上执行。请注意,您需要参数,因为您无法按名称找到当前路线。

答案 1 :(得分:0)

为什么不创建一个普通的文件夹namned / HandleAzureTask,并在模块注册的文件夹中放置一个单独的web.config。

然后模块将针对该文件夹中的所有请求运行。

要获得授权,您还可以在web.config中设置授权元素以禁止*