HttpModule仅适用于特定的MVC路由

dot*_*tsa 3 asp.net-mvc routes httpmodule asp.net-mvc-4

我有一个习惯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>
Run Code Online (Sandbox Code Playgroud)

Sto*_*eak 5

每个请求都会调用HttpModules(HttpHandlers,可以过滤).如果您只想在所选路线上执行任务,则可以执行以下操作:

设置这样的路线:

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

在您的模块上:

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()
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

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