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中)需要覆盖响应内容。