13

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

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是正确的。

4

2 回答 2

17

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

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

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

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

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

于 2013-01-14T22:25:42.533 回答
2

默认情况下,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 处理程序将起作用。这篇文章与您的问题类似,仅与图像有关(查找“更好:自定义 HttpHandlers”部分)

于 2013-01-14T22:05:35.557 回答