在我的网络应用程序中,我的路径如下:
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
是正确的。
答案 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”部分)