asp.net-mvc - HttpModule 仅在特定 MVC 路由上

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

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

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

我希望此模块仅在 /HandleAzureTask 路由上调用/处理。

由于这不是 Controller ,因此我无法真正在其上设置 [Authorize] 属性;如何强制仅在用户经过身份验证时调用/处理它?<​​/p>

我使用 ASP.NET MVC 4,目前已将我的模块添加到 web.config 中,如下所示:

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

最佳答案

每个请求都会调用 HttpModule(相反,可以过滤 HttpHandler)。如果您只想在选定的路线上执行任务,您可以执行以下操作:

设置这样的路线:

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()
    {
        //
    }
}

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

关于asp.net-mvc - HttpModule 仅在特定 MVC 路由上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15798828/

相关文章:

c# - 自动设置 ASP.Net App_Sprites 权限

c - 获取网关以用于 ANSI C 中的给定 ip

asp.net-mvc - addTagHelper Html.GetEnumSelectList 不工作

c# - 如何解决 ASP.NET MVC Kendo UI 网格中的 CRUD 操作问题

c# - Ajax 成功函数返回空数据

java - 我们如何在 Apache Camel 中的单个路径中选择 2 个文件,并同时处理它们?

rest - 在 ServiceStack 中组合 URL 和 POST 变量

c# - 使用 ModelBinder 属性与 ModelBinders.Add()

asp.net-mvc - 命名空间问题,单个解决方案中的多个项目

javascript - 添加多个局部 View ,但第一个 View 缺少表单