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

Mar*_*ius 2 asp.net-mvc

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

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

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

Dar*_*rov 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>
Run Code Online (Sandbox Code Playgroud)

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

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以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>
Run Code Online (Sandbox Code Playgroud)

和这样的路线:

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

这样的动作:

public class RibbonController
{
    // GET Content/Ribbon/Scripts/*
    public ActionResult Index(string name)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

或者使用特定处理程序,您可以为所有请求启用托管模块:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    ...
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

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