是的,这是可能的。您需要将以下处理程序添加到您的 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>
但我不建议您启用此选项,因为现在所有请求都将通过托管管道,即使是来自可能对应用程序性能产生负面影响的静态资源的请求。最好只为选定的 url 选择性地启用此功能。