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

时间:2013-01-14 21:56:36

标签: asp.net-mvc iis asp.net-mvc-4 asp.net-mvc-routing

在我的网络应用程序中,我的路径如下:

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

这条路线背后的想法是与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是正确的。

2 个答案:

答案 0 :(得分:14)

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

<add 
    name="AdfsMetadata" 
    path="/FederationMetadata/2007-06/FederationMetadata.xml" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" />

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

  

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

请仔细检查一下。尝试使用和不使用路由定义中的Controller后缀。

答案 1 :(得分:1)

IIS默认情况下将该文件作为静态服务而不进入ASP管道,您是否可以将路由更改为不具有.xml扩展名(至少您没有必要具有该特定要求)

您可以指定这样的路线:

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

其他解决方案是添加到您的web.config

<modules runAllManagedModulesForAllRequests="true">

但我建议您尽可能避免这种情况,因为它的作用是阻止IIS提供所有静态文件

编辑上次尝试...该特定路径的自定义http处理程序可行。这个post类似于你的问题只有图像(寻找“更好:自定义HttpHandlers”部分)