Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc HttpModule仅在特定MVC路由上_Asp.net Mvc_Asp.net Mvc 4_Routes_Httpmodule - Fatal编程技术网

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

Asp.net mvc HttpModule仅在特定MVC路由上,asp.net-mvc,asp.net-mvc-4,routes,httpmodule,Asp.net Mvc,Asp.net Mvc 4,Routes,Httpmodule,我有一个自定义的IHttpModule,我只想在特定路线上工作 例如:http://example.com/HandleAzureTask 我希望仅在/HandleAzureTask路由上调用/处理此模块 因为这不是一个控制器,所以我不能真正设置它的[Authorize]属性;如果用户经过身份验证,我如何强制只调用/处理它 我在ASP.NET MVC 4上,目前已将我的模块添加到web.config中,如下所示: 每个请求都会调用HttpModules(可以过滤HttpHandlers)。如果只

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

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

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

因为这不是一个控制器,所以我不能真正设置它的
[Authorize]
属性;如果用户经过身份验证,我如何强制只调用/处理它

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


每个请求都会调用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()
    {
        //
    }
}

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

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

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


要获得工作授权,您还可以将web.config中的authorization元素设置为disallow*

我建议为此路由创建自定义路由约束…您的HttpModule在做什么?如果您只在ASP.NET MVC应用程序上使用此模块,您可以考虑将其改写为Actudio过滤器。我有一个WebDAV服务器IHTTP模块,用于处理Office应用程序和Azure BLB存储之间的交互。是否需要将该代码保持为模块?如果不是,我建议将其重构为控制器/操作方法,以便您可以利用MVC授权。然后,相应地使用routes集合。@Darvindave这个问题的部分原因是我正在从事的一个项目。你可以在这里看到:卢卡,这是否意味着我必须有一个实际控制员?如果是,我是否在控制器上设置[授权]标签?如果没有,我将如何通过自定义过滤器在路由级别将[authorize]标记添加到“HandleAzureTask”控制器?因此,基本上每次加载时仍将调用HttpModule,但仅当RoutedData.Values[“enableHandler”]!=无效的我将其用于WebDav文件存储,但实际文件存储在Azure Blob中。@dotsa
[Authorize]
属性在这里几乎没有作用,因为无论如何都会调用HttpModule。如果要筛选对模块的访问权限,可以添加
请求。IsAuthenticated
条件。问题是您使用的是一个HttpModule,而这样的组件集成到了ASP.NET管道中。请注意,与模块不同,控制器可以支持路径参数。在这种情况下,控制器的必要性是什么。我还可以在IHttpModule中过滤url参数,如果它包含“HandleAzureTask”,则句柄将完成它的工作。我错过什么了吗?或者通过使用控制器,我们可以添加[Authorize]属性?@dotsa在这种情况下,我认为控制器和操作方法是不相关的。实际执行的模块代码(在if中)需要覆盖响应内容。