Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC路由:绕过路径的静态文件处理程序_C#_.net_Asp.net Mvc_Routes_Httphandler - Fatal编程技术网

C# ASP.NET MVC路由:绕过路径的静态文件处理程序

C# ASP.NET MVC路由:绕过路径的静态文件处理程序,c#,.net,asp.net-mvc,routes,httphandler,C#,.net,Asp.net Mvc,Routes,Httphandler,我已经在谷歌上搜索和修补了几个小时,并没有取得多大进展,所以希望这里有人能帮上忙 我正试图将所有请求发送到某个路径,由第三方组件处理 编辑,我需要所有其他路径的请求才能正常运行 我正在使用具有通配符映射的路由处理程序,如下所示: 添加(新路由(“pathiwant/{*EverythingElse}”,新的MyRouteHandler()); 所有传统路由都正确地转发给处理程序,处理程序很好地转发给第三方组件。当我点击静态文件(.html、.txt等)时,它们会被静态文件处理程序而不是我的处理

我已经在谷歌上搜索和修补了几个小时,并没有取得多大进展,所以希望这里有人能帮上忙

我正试图将所有请求发送到某个路径,由第三方组件处理

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

我正在使用具有通配符映射的路由处理程序,如下所示:

添加(新路由(“pathiwant/{*EverythingElse}”,新的MyRouteHandler()); 所有传统路由都正确地转发给处理程序,处理程序很好地转发给第三方组件。当我点击静态文件(.html、.txt等)时,它们会被静态文件处理程序而不是我的处理程序拾取,因此我尝试关闭静态文件处理程序,如下所示(简化):


这会关闭静态文件处理程序,但MVC仍然不会选择路由

我不希望依赖于创建自己的处理程序并将其注入ASP请求堆栈,因为似乎应该有一种适合MVC的方法来做到这一点


有什么想法吗?谢谢。

这里有几个选项

如果确实希望所有请求都通过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站点上,大多数静态文件是如何从两个众所周知的目录处理的,这是一个更好的选择。

最好的解决方案可能是使用代理将请求从原始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的路径;他们已经处于最后状态了。第二个重写规则代理(而不是重定向)请求

e、 g

变成

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

代理请求而不是执行客户端重定向可以使嵌套的相对路径也起作用(并对最终用户隐藏秘密)。

谢谢。这肯定是我尝试过的,但我确实希望所有其他路径都能正常处理。现在似乎真的没有一种MVC方法可以做到这一点,我应该在MVC之前分解并添加处理程序。不确定您想要和不想要处理的具体内容,但是是的,为了在mvc中处理事情,asp.net管道需要接收所有适当的请求。重要说明:
仅适用于运行集成模式管道的应用程序池。这不适用于在经典模式下运行的应用程序池。请注意:不建议使用runAllManagedModulesForAllRequests=“true”-有关详细信息,请参阅Hanselman文章。这可能会对性能产生负面影响,而不仅仅是性能。当模块针对所有请求运行时,通过管道推送PDF和XML以及其他文件的URL可以产生有趣的结果。警告买主。
/load/1234/rel?path=file.xml