2012-06-29 56 views
17

我一直在谷歌搜索和修补了几个小时,并没有真正取得很大进展,所以希望这里有人可以提供帮助。ASP.NET MVC路由:绕过路径的静态文件处理程序

我试图让所有的请求到一个特定的路径由第三方组件处理。

编辑而且我需要所有其他路径的所有请求才能正常运行。

我使用的是路由处理,像这样一个通配符映射:

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler())); 

所有传统路线前进正确的处理程序,它很好地转发到第三方组件。当我打击静态文件(.html,.txt等)时,它们会被StaticFile处理程序而不是我的处理程序拾取,因此我试图关闭StaticFile处理程序,如下所示(简化):

<system.webServer> 
    <handlers> 
    <remove name="StaticFile"/> 
    </handlers> 
</system.webServer> 

这会关闭StaticFile处理程序,但MVC仍然不会拾取路径。

我不想回到创建自己的处理程序并注入ASP请求堆栈,因为它似乎应该有一个MVC快乐的方式来做到这一点。

有什么想法?谢谢。

回答

14

这里有几个选项。

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

如果你真的想通过asp.net管道运行的所有请求,那么你需要。

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

更新

另一种选择,特别是如果你需要绕过静态处理程序被限制到您的网站的一个子集,是对使用以下

<add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/subdirectory/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

考虑如何mvc网站,大多数静态文件是从一对熟知的目录中处理的,这是一个更好的选择。

+0

感谢。这绝对是我尝试过的,但我确实需要正常处理所有其他路径。这真的开始似乎没有MVC的方式来做到这一点,我应该分解并在MVC之前添加处理程序。 – jmoss

+0

不确定你想要和不想处理的具体细节,但是,为了处理mvc中的事情,asp.net管道需要接收所有适当的请求。 –

+0

重要提示:''仅适用于运行集成模式管道的应用程序池。这对于在Classic模式下运行的应用程序池不起作用。 – BenSwayne

2

对此的最佳解决方案可能是使用URL Rewriter将来自原始URL的请求代理为MVC友好选择。

例如,您需要能够自动加载从数据库提供的内容中的相对URL。

RewriteRule ^/load/(\d+)/rel(\?.*)? - [L] 
RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC] 

这些规则将让您设置了两个MVC路线:

routes.MapRoute(
    "Load Item", 
    "load/{itemId}", 
    new { controller = "Load", action = "Index" } 
    ); 

routes.MapRoute(
    "Load Relative Item", 
    "load/{itemId}/rel", //?path= 
    new { controller = "Load", action = "Relative" } 
    ); 

然后你的操作方法比较简单:

public ActionResult Index(int itemId) { ... } 

public FileStreamResult Relative(int itemId, string path) { ... } 

第一个重写规则,以防止有含路径/ rel被重写;他们已经在最后的形式。第二个重写规则代理(而不是重定向)请求。

例如

/load/1234/file.xml 

变得

/load/1234/rel?path=file.xml 

代理所述请求而不是做客户端重定向能嵌套相对路径以及工作(并隐藏从最终用户的秘密酱。)