捕获对内容文件夹中的文件的请求以处理控制器操作

时间:2013-03-31 17:06:14

标签: asp.net-mvc

我有一个我必须使用的第三方小部件库。该库具有文件的硬编码字符串。是否可以通过路由拦截此请求?我的尝试看起来像这样:

routes.MapRoute(name: "ribbonbar",
                url: "Content/Ribbon/Scripts/Ribbon.Tabs.foo",
                defaults: new { controller = "Ribbon", action = "Index" });

但我只得到了404.这是不可能的还是我混淆了什么?

1 个答案:

答案 0 :(得分:5)

是的,这是可能的。您需要将以下处理程序添加到web.config中,以确保此请求通过托管管道和路由:

<system.webServer>
    <handlers>
        ...
        <add 
            name="MyCustomhandler" 
            path="Content/Ribbon/Scripts/Ribbon.Tabs.foo" 
            verb="GET" 
            type="System.Web.Handlers.TransferRequestHandler" 
            preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

然后您可以使用以下控制器操作来提供此请求:

public class RibbonController
{
    // GET Content/Ribbon/Scripts/Ribbon.Tabs.foo
    public ActionResult Index()
    {
        var file = Server.MapPath("~/App_Data/foo.bar");
        return File(file, "application/foo-bar");
    }
}

您还可以从同一控制器操作向Content/Ribbon/Scripts/*提供所有请求:

<system.webServer>
    <handlers>
        ...
        <add 
            name="MyCustomhandler" 
            path="Content/Ribbon/Scripts/*" 
            verb="GET" 
            type="System.Web.Handlers.TransferRequestHandler" 
            preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

和这样的路线:

routes.MapRoute(
    name: "ribbonbar",
    url: "Content/Ribbon/Scripts/{name}",
    defaults: new { controller = "Ribbon", action = "Index" }
);

采取类似的行动:

public class RibbonController
{
    // GET Content/Ribbon/Scripts/*
    public ActionResult Index(string name)
    {
        ...
    }
}

除了使用特定处理程序之外,您还可以为所有请求启用托管模块:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    ...
</system.webServer>

但我不建议您启用此选项,因为现在所有请求都将通过托管管道,即使是那些可能对应用程序性能产生负面影响的静态资源。最好只为选定的网址选择性地启用它。