【问题标题】:Set up RAMMFAR for certain paths only仅为某些路径设置 RAMMFAR
【发布时间】:2012-12-15 23:18:50
【问题描述】:
我有一个 ASP.NET 4.5 MVC 应用程序。我不想设置 RAMMFAR (runAllManagedModulesForAllRequests),因为这会不必要地通过 ASP.NET 管道发送对静态资源的请求;但是,我确实希望所有以路径 /Download/ 开头的请求都通过 ASP.NET 路由管道运行,而不管扩展名如何。这样我可以将它们路由到控制器并提供动态生成的资源。
如何做到这一点?我无权访问 IIS 设置,但希望有一种方法可以通过 web.config 执行此操作。
【问题讨论】:
标签:
asp.net
asp.net-mvc
web-config
asp.net-mvc-routing
【解决方案1】:
RAMMFAR 设置针对每个应用程序。如果您希望站点的不同部分具有不同的设置,则必须创建单独的 IIS 应用程序,但不幸的是,您声明这不适合您。
我两个有两个旁注:
- 您确定需要 RAMMFAR 吗?我认为在使用 IIS 7.5 和更新版本时,它很少需要,因为 IIS 和 ASP.NET 几乎可以正确处理托管/本机请求。
- 您是否认为这是一个始终启用它的实际问题?毫无疑问,RAMMFAR 会使事情变慢,但问题是它是否会在您的应用程序中造成可衡量的影响。即使静态文件确实通过了一些托管代码,文件的最终处理也会在本机代码中处理。因此,“通过” ASP.NET 托管管道需要做一些额外的工作,但一旦完成,它就会返回到本机 IIS/Windows 代码。
【解决方案2】:
令人惊讶的是,这个问题很久没有在 Stack Overflow 中得到解答。
正如您所提到的 - 当您只需要捕获站点中特定路径的所有请求时,不需要 runAllManagedModulesForAllRequests。
您可以指定应该发送到 MVC 处理程序的路径模式,如下所示
<add name="DynamicDownloadHandler" path="/download/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
上述模式将捕获无扩展名和带扩展名的路径。
A sample implementation for serving dynamic images in MVC is linked here.