2

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

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

但我只有一个 404。这是不可能的还是我弄混了什么?

4

1 回答 1

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>

但我不建议您启用此选项,因为现在所有请求都将通过托管管道,即使是来自可能对应用程序性能产生负面影响的静态资源的请求。最好只为选定的 url 选择性地启用此功能。

于 2013-03-31T17:09:49.307 回答