我有一个必须使用的第三方小部件库。该库有一个硬编码到文件的字符串。是否可以通过路由拦截此请求?我的尝试如下:
routes.MapRoute(name: "ribbonbar",
url: "Content/Ribbon/Scripts/Ribbon.Tabs.foo",
defaults: new { controller = "Ribbon", action = "Index" });
但我只得到了 404。这是不可能的还是我混淆了一些东西?
最佳答案
是的,这是可能的。您需要将以下处理程序添加到您的 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>
然后您可以使用以下 Controller 操作来处理此请求:
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");
}
}
您还可以从同一 Controller 操作向 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" }
);
像这样的 Action :
public class RibbonController
{
// GET Content/Ribbon/Scripts/*
public ActionResult Index(string name)
{
...
}
}
除了使用特定的处理程序,您还可以为所有请求启用托管模块,如下所示:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
...
</system.webServer>
但我不建议您启用此选项,因为现在所有请求都将通过托管管道,即使是来自静态资源的请求,这可能会对应用程序的性能产生负面影响。最好只对选定的网址有选择地启用此功能。
关于asp.net-mvc - 捕获对内容文件夹中文件的请求以通过 Controller 操作进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15732073/