防止静态文件处理程序拦截类似文件名的URL

fer*_*ero 11 iis asp.net-mvc asp.net-mvc-routing asp.net-mvc-4

在我的Web应用程序中,我有一个如下所示的路由:

routeCollection.MapRoute(
    "AdfsMetadata",                                                // name
    "FederationMetadata/2007-06/FederationMetadata.xml",           // url
    new { controller = "AdfsController", action = "MetaData" });   // defaults
Run Code Online (Sandbox Code Playgroud)

这条路线背后的想法是与Microsoft AD FS服务器(2.0+)更好地协作,当您指定主机名时,此时会查找AD FS元数据.MVC3一切正常.但我们最近将项目升级到MVC4,现在调用此URL会产生404,错误页面上提到的处理程序是StaticFile物理路径D:\path\to\my\project\FederationMetadata\2007-06\FederationMetadata.xml.我假设MVC或ASP.NET"认为"它必须是对静态文件的请求并查找该文件,但它不是文件.数据是动态生成的 - 这就是我将URL路由到控制器操作的原因.问题是即使Phil Haack的Route Debugger也行不通.除了IIS试图访问不存在的物理文件之外,它只是404而没有进一步的信息.

有人有解决方案吗?我只想将此URL路由到控制器操作.

PS:我不是100%确定原因是升级到MVC4,这只是猜测,因为错误发生在升级的大致同一时间,并且相同的路由在另一个仍在使用MVC3的项目中工作.

编辑:

我有一个ControllerFactory需要完整类名的自定义(AdfsController而不是Adfs),所以Controller在这种情况下后缀是正确的.

Dar*_*rov 15

将以下内容添加到节点的<handlers>部分<system.webServer>:

<add 
    name="AdfsMetadata" 
    path="/FederationMetadata/2007-06/FederationMetadata.xml" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" />
Run Code Online (Sandbox Code Playgroud)

这指示IIS对指定URL的GET请求应由托管管道处理,而不应视为静态文件并由IIS直接提供.

我有一个自定义的ControllerFactory需要完整的类名(AdfsController而不是Adfs),因此在这种情况下后缀Controller是正确的.

请仔细检查一下.Controller在路径定义中尝试使用和不使用后缀.