我已经被这个问题困扰了好几个小时了。
我有一个名为“DecisionPoint”的控制器,并且在其“ApplicationState”操作上设置了一个断点。无论我如何尝试,我都会在浏览器中收到 404 错误。我怀疑我的路线不正确,所以我下载了一个路线调试器,它会将我尝试的 URL 与控制器和操作相匹配。那么为什么我会得到 404 并且从未看到断点命中?
/DecisionPoint/ApplicationState/no/worky --> 404
控制器:
public ActionResult ApplicationState(string fileName, string stateString)
{
string filePath = GetDpFilePath(fileName);
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.Load(filePath);
HtmlNode stateScriptNode =
htmlDocument.DocumentNode.SelectSingleNode("/html/head/script[@id ='applicationState']");
stateScriptNode.InnerHtml = "var applicationStateJSON =" + stateString;
htmlDocument.Save(filePath);
return Json("State Updated");
路线
routes.MapRoute(
"DecisionPointState", // Route name
"DecisionPoint/ApplicationState/{fileName}/{stateString}", // URL with parameters
new {controller = "DecisionPoint", action = "ApplicationState"} // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}`
**Update**
我创建了一个全新的控制器并且它可以工作。这就是我的路由表现在的样子。状态控制器正确路由到 SaveState
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"StateRoute", // Route name
"State/SaveState/{file}/{state}", // URL with parameters
new { controller = "State", action = "SaveState", file = UrlParameter.Optional, state = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"DPStateRoute", // Route name
"DecisionPoint/ApplicationState/{file}/{state}", // URL with parameters
new { controller = "DecisionPoint", action = "ApplicationState", file = UrlParameter.Optional, state = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
// RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}
}
所以我很困惑..
确保您的控制器类名为 DecisionPointController 而不是 DecisionPoint
如果您的
AreaRegistration
类和 Controller
类不在同一个命名空间中,您将处于这种情况 - 路由将匹配(并且 RouteDebugger 将确认这一点),但您会在“正确的”网址。
解决方案是确保两个类位于同一命名空间中。
愚蠢,但它让我: 确保您的控制器继承自
Controller
我失踪了
app.MapControllers();
在我的program.cs中(.NET 6及以上版本)
发生这种情况可能是因为您的
Controller
位于另一个项目中,该项目引用了不同版本的 System.Web.Mvc
!
我也有同样的症状 - 找到了正确的路线,但得到了 404!在 HttpHandler.ProcessRequest 上,抛出异常,表示处理程序的控制器未实现
IController
。
我最近也遇到了同样的问题。对我来说,问题是我有两个具有相同名称的控制器,如果命名空间不同(一个位于一个区域中)。
我不是路由专家,但我总是为默认参数添加所有参数:
routes.MapRoute(
"DecisionPointState", // Route name
"DecisionPoint/ApplicationState/{fileName}/{stateString}", // URL with parameters
new {controller = "DecisionPoint",
action = "ApplicationState"
fileName = UrlParameter.Optional,
stateString = UrlParameter.Optional
} // Parameter defaults
);
就我而言,同一问题的答案是需要“包含在项目中”相关的控制器和视图,而不是不正确的路由规则。
当我的创建时,由于某种原因它们没有自动包含在内。我关闭并重新打开解决方案后发现了这个问题。
{+1 恨}授予 Visual Studio,因为它有缺陷的超自动化让我深入研究 Web.Config 文件,尝试添加扩展,甚至尝试(但失败)创建一个像样的 ErrorController。
另请注意,控制器类必须具有 public 访问修饰符。我将我的控制器写为:
[ApiController]
[Route("[controller]")]
class HomeController : ControllerBase
{
...
}
并且由于类的默认修饰符是 internal,因此该控制器中的所有操作都不匹配任何路由。