3

我有一个习惯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>
4

2 回答 2

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

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

于 2013-04-06T19:22:27.690 回答
0

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

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

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

于 2013-04-12T20:36:51.863 回答