我有一个我必须使用的第三方小部件库。该库具有文件的硬编码字符串。是否可以通过路由拦截此请求?我的尝试看起来像这样:
routes.MapRoute(name: "ribbonbar",
url: "Content/Ribbon/Scripts/Ribbon.Tabs.foo",
defaults: new { controller = "Ribbon", action = "Index" });
但我只得到了404.这是不可能的还是我混淆了什么?
答案 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>
但我不建议您启用此选项,因为现在所有请求都将通过托管管道,即使是那些可能对应用程序性能产生负面影响的静态资源。最好只为选定的网址选择性地启用它。