我有一个我必须使用的第三方小部件库.该库具有文件的硬编码字符串.是否可以通过路由拦截此请求?我的尝试看起来像这样:
routes.MapRoute(name: "ribbonbar",
url: "Content/Ribbon/Scripts/Ribbon.Tabs.foo",
defaults: new { controller = "Ribbon", action = "Index" });
Run Code Online (Sandbox Code Playgroud)
但我只得到了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>
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选择性地启用它会好得多.
归档时间: |
|
查看次数: |
1142 次 |
最近记录: |