4

我已经在互联网上搜索了高低,并检查了所有以前回答的具有相同标题的问题,但我无法弄清楚这一点。

我从身份验证控制器中的操作方法返回RedirectToAction("Index", "Home"),然后收到以下异常:

Server Error in '/' Application.
The controller for path '/Home' was not found or does not implement IController.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: The controller for path '/Home' was not found or does not implement IController.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[HttpException (0x80004005): The controller for path '/Home' was not found or does not implement IController.]
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +683921
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +89
   Castle.Proxies.Invocations.IControllerFactory_CreateController.InvokeMethodOnTarget() +155
   Castle.DynamicProxy.AbstractInvocation.Proceed() +116
   Glimpse.Core.Extensibility.ExecutionTimer.Time(Action action) +85
   Glimpse.Core.Extensibility.AlternateMethod.NewImplementation(IAlternateMethodContext context) +186
   Castle.DynamicProxy.AbstractInvocation.Proceed() +604
   Castle.Proxies.IControllerFactoryProxy.CreateController(RequestContext requestContext, String controllerName) +193
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +305
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +87
   System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Func`1 func) +41

[HttpException (0x80004005): Execution of the child request failed. Please examine the InnerException for more information.]
   System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Func`1 func) +785832
   System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +3977
   System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage) +275
   System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) +94
   System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter) +700
   System.Web.Mvc.Html.ChildActionExtensions.Action(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues) +123
   Panoptes.Ui.Web.Views.Home.Index.Execute() in c:\Dropbox\Energy Management System\Application\Panoptes\Panoptes.Ui.Web\obj\CodeGen\Views\Home\Index.cshtml:48
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +280
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +126
   System.Web.WebPages.StartPage.ExecutePageHierarchy() +143
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +181
   RazorGenerator.Mvc.PrecompiledMvcView.Render(ViewContext viewContext, TextWriter writer) +952
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +378
   Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionResult_callback(ControllerContext controllerContext, ActionResult actionResult) +21
   Castle.DynamicProxy.AbstractInvocation.Proceed() +116
   Glimpse.Core.Extensibility.ExecutionTimer.Time(Action action) +85
   Glimpse.Core.Extensibility.AlternateMethod.NewImplementation(IAlternateMethodContext context) +186
   Castle.DynamicProxy.AbstractInvocation.Proceed() +604
   System.Web.Mvc.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17() +33
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +854172
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +854172
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +265
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +838644
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +28
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +65
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +51
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +51
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288


Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18034

身份验证控制器如下所示:

    public class AuthenticationController : Controller
{
    private ILogService _logService;
    private IEmailProvider _emailProvider;
    private IMembershipProvider _membershipProvider;
    private IAuthenticationProvider _authenicationProvider;

    public AuthenticationController(ILogService logService, IEmailProvider emailProvider, IMembershipProvider membershipProvider, IAuthenticationProvider authenicationProvider)
    {
        _logService = logService;
        _emailProvider = emailProvider;
        _membershipProvider = membershipProvider;
        _authenicationProvider = authenicationProvider;
    }

    [AllowAnonymous]
    [HttpGet]
    ////[OutputCache(Duration = 3600, VaryByParam = "none")]
    public ActionResult Index()
    {
        return View();
    }

    [AllowAnonymous]
    [HttpPost]
    [ValidateHttpAntiForgeryToken] 
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (Request.IsAuthenticated)
        {
            return RedirectToAction("Index", "Home");
        }

        if (ModelState.IsValid)
        {
            if (_membershipProvider.ValidateUser(model.Username, model.Password))
            {
                _authenicationProvider.AuthenticateUser(model.Username);
                ////this.HttpContext.User = new GenericPrincipal(new GenericIdentity(model.Username), null);

                if (!string.IsNullOrEmpty(returnUrl))
                {
                    if (Url.IsLocalUrl(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        _logService.Log(new SecurityException(string.Format("Open redirect to {0} detected (Username {1})", returnUrl, model.Username)));
                        return View("Index", model);
                    }
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError(string.Empty, Resources.Controller.View.Authentication.Index.IncorrectUsernamePassword);
            }
        }

        return View("Index", model);
    }

    [AllowAnonymous]
    [HttpPost]
    [ValidateHttpAntiForgeryToken] 
    public ActionResult ForgotPassword(LoginModel model)
    {
        if (ModelState.IsValidField("Username"))
        {
            if (!_membershipProvider.EnablePasswordRetrieval)
            {
                throw new Exception(Resources.Controller.View.Authentication.Index.PasswordRetreivalNotAllowed);
            }

            IMembershipUser user = _membershipProvider.FindUsersByName(model.Username).FirstOrDefault();

            if (user != null)
            {
                try
                {
                    _emailProvider.Send(ConfigurationHelper.GetSmtpSettings().Smtp.From, user.EmailAddress, Resources.Global.PasswordRecoveryEmailSubject, user.GeneratePasswordRetreivalEmail());
                    ModelState.AddModelSuccess(Resources.Controller.View.Authentication.Index.PasswordSentViaEmail);
                }
                catch (Exception ex)
                {
                    _logService.Log(ex);
                    ModelState.AddModelError(string.Empty, Resources.Controller.View.Authentication.Index.UnableToRetreivePassword);
                }
            }
            else
            {
                ModelState.AddModelError(string.Empty, Resources.Controller.View.Authentication.Index.EmailAddressDoesNotExist);
            }
        }

        ViewBag.ShowForgottenPasswordForm = "true";

        return View("Index", model);
    }

    [HttpGet]
    public ActionResult Logout()
    {
        _authenicationProvider.Logout();
        ModelState.AddModelInformation(Resources.Controller.View.Authentication.Index.Logout);
        return View("Index");
    }
}

我的 HomeController 如下所示:

public class HomeController : Controller
{
    private IMembershipProvider _membershipProvider;
    private IAuthenticationProvider _authenticationProvider;

    public HomeController(IMembershipProvider membershipProvider, IAuthenticationProvider authenticationProvider)
    {
        _membershipProvider = membershipProvider;
        _authenticationProvider = authenticationProvider;
    }

    public ActionResult Index()
    {
        return View(_membershipProvider.GetCurrentUser());
    }
}

请参阅下面我的 RouteConfig:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}",
            defaults: new { controller = "Authentication", action = "Index" });
    }
}

RouteDebugger 为路由 {controller}/{action} 和 {*catchall} 返回 TRUE,并确认 AppRelativeCurrentExecutionFilePath 为:~/Home

我已经调试了代码,我可以成功调试并进入 HomeController 构造函数和 Index 操作方法。我也能够进入“~/Views/Home/Index.cshtml”但是它在代码行抛出异常:

<span class="username">@Model.UserName</span>

有趣的是,在我进入这段代码之前,我可以将“@Model.UserName”添加到我的手表列表中,我可以很好地看到该对象及其属性,但由于某种原因,它在进入或越过这一行时会引发异常代码。

如果调试器步入 HomeController、Index 操作方法和 Index 视图,为什么会突然抛出找不到路径“~/Home”的 HomeController 的异常?

捕获的 fiddler 数据可以在以下链接中找到:http: //dh.st/IqV

我已经使用 Razor Generator 来编译我的视图,并且我还使用 Ninject.Mvc 来解析我的控制器。还值得一提的是,我已经清理并重新生成了编译视图,并且我的项目不包含任何注册区域。

有任何想法吗?这可能很简单或显而易见,但我是 MVC 的新手,并且正在阅读/学习。

谢谢

4

1 回答 1

7

所以人们可以看到这个问题在这里得到了回答,它为什么抛出异常以及我是如何修复它的:

由于 HomeController 索引视图中的以下代码行,引发了异常:

<a href="@Html.Action("Log Out","Logout", "Authentication")"><i class="icon-key"></i> Log Out</a> 

如您所见,它传递了错误的参数,并且“注销”作为动作名称被传入,而实际上这应该是“注销”。我将其更正为以下内容并且它有效:

<a href="@Html.Action("Logout", "Authentication")"><i class="icon-key"></i> Log Out</a> 

因此,如果您遇到此异常并且像我一样无法理解为什么,那么请确保检查您视图中的其余代码以确保它是正确的。在这种情况下,框架不提供有意义的异常消息和堆栈跟踪。

于 2013-05-10T07:37:11.320 回答