在我的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路由到控制器操作。
P.S。:我是 不是100% 确定原因是升级到MVC4,这只是猜测,因为错误发生在与升级大致相同的时间,并且相同的路由在另一个仍在使用MVC3的项目中工作。
编辑:
将以下内容添加到 <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
路径定义中的后缀。
将以下内容添加到 <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
路径定义中的后缀。
默认情况下,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”部分)