我有一个自定义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>
答案 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中设置授权元素以禁止*