更新:我们最近的完全重建问题已停止,但自发布此问题以来,web.config和global.asax.cs文件尚未更改。我仍然不确定是什么导致我观察到的行为。
原帖:
在我正在处理的Web应用程序中,我们有两个可能的安装路径 - 一个用于新安装,另一个用于升级。根据选择的路径,我们的安装程序调用的初始URL为<siteroot>/Install
或<siteroot>/Install?upgrade=true
。问题是显然我们的路由映射没有正确处理第二个URL,即使它与所需的路由定义匹配(根据Haack的路由调试器),它也会做出奇怪的事情。一些奇怪的事情:网址<siteroot>/Install?upgrade=true
被重写为<siteroot>/Install/?upgrade=true
。 Haack的routedebugger在路由表的“匹配当前请求”列中显示与默认路由匹配的URL,但在报告“匹配路由”时,它显示“n / a”。没有报告路由数据 - 没有控制器,没有动作,也没有urlParameter。此外,routedebugger报告的生成的URL是Generated URL: <siteroot>/NotFound?upgrade=true using the route "NotFound"
,但请求与“NotFound”路由不匹配,并且当前请求信息显示(某些)正确的信息:
AppRelativeCurrentExecutionFilePath is the portion of the request that Routing acts on.
AppRelativeCurrentExecutionFilePath: ~/Install/
通过调用<siteroot>/Install/Index?upgrade=true
可以很容易地解决这个特定问题,但我宁愿清楚地了解为什么会发生这种情况并找出根本原因而不是解决问题。这是重要的代码:
的Global.asax.cs:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.asp/{*pathInfo}");
//404 error page
routes.MapRoute("NotFound", "NotFound",
new { controller = "Navigation", action = "NotFound" }
);
// 404 device not found page
routes.MapRoute("DeviceNotFound", "DeviceNotFound",
new { controller = "Navigation", action = "DeviceNotFound" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new[] { "Nm.Web.Mvc.Controllers", "Nm.Web.UI" }
);
}
InstallController.cs:
[HttpGet]
public ActionResult Index(int? installStep = null, bool upgrade = false)
{
var ins = DependencyResolver.Current.GetService<IInstallService>();
if (installStep != null)
{
ins.InstallStep = (InstallStep)installStep;
}
if ((upgrade == true) && (ins.HasDefaultAdminPassword() == false))
{
ins.InstallStep = InstallStep.Finished;
return RedirectToAction("Login", "User");
}
if (isLocalServer() && ins.InstallStep == InstallStep.SetAdminPassword)
{
return RedirectToAction("SetAdminPassword");
}
return RedirectToAction("SelectPath");
}
我在Install controller Index方法中设置了一个断点,另一个在Global.asax的Application_Error方法中设置了断点,并且都没有被触发。我不确定“NotFound”的内容来自哪里 - 我们在web.config中有这个部分:
<customErrors mode="Off" defaultRedirect="~/Error" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
但正如您所看到的,我们关闭了自定义错误,并且没有任何迹象表明它正在触及ErrorController(我的NotFound方法中有另一个断点,只是为了确定)。
我已经尝试设置备用路由以查看是否会捕获它,但即使routedebugger再次显示此路由与URL匹配,我仍然会得到相同的结果。
routes.MapRoute(
"Install", // Route name
"Install/{upgrade}", // URL with parameters
new { controller = "Install", action = "Index", upgrade = UrlParameter.Optional }, // Parameter defaults
new[] { "Nm.Web.Mvc.Controllers", "Nm.Web.UI" }
);
有没有人有任何想法或建议?