【发布时间】:2011-05-23 16:55:49
【问题描述】:
我刚刚遇到了一个奇怪的问题。我已经修复了它,但我希望你能帮助我更好地了解实际出了什么问题。我将首先解释发生了什么。问题涉及一个简单的 MVC3 RC1 应用程序。
在我的应用程序的母版页中,调用了控制器上的操作以呈现登录表单:
@Html.Action("LoginForm", "Account")
AccountController 类的操作方法返回一个包含登录表单的 PartialViewResult。
public PartialViewResult LoginForm()
{
return PartialView();
}
今天我对这个动作方法进行了更改,并将其归因于 HttpGetAttribute,如下所示:
[HttpGet]
public PartialViewResult LoginForm()
{
return PartialView();
}
这就是导致问题的原因。然而,这些问题只存在于一种特定的场景中——这让我感到困惑。当发布表单到控制器时,只要控制器操作返回RedirectToRouteResult,一切都会正常工作。如果该操作只是返回一个 ViewResult(到它的默认视图),我的 Http404 错误处理将启动并永远循环。
我已经以与此问题的第三个答案中描述的非常相似的方式实现 404 错误处理:Requirements for 404。如果您不想阅读那篇文章,简单来说,我会覆盖我的基本控制器类上的 HandleUnknownAction 方法,并在该方法中实例化我的 ErrorController 类的实例并在其上调用 Execute,并传递给它一个 RouteData 的实例:
protected override void HandleUnknownAction(string actionName)
{
// If controller is ErrorController dont 'nest' exceptions
if (this.GetType() != typeof(ErrorController))
this.InvokeHttp404(HttpContext);
}
public ActionResult InvokeHttp404(HttpContextBase httpContext)
{
IController errorController = DependencyResolver.Current.GetService<ErrorController>();
var errorRoute = new RouteData();
errorRoute.Values.Add("controller", "Error");
errorRoute.Values.Add("action", "Http404");
errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString);
errorController.Execute(new RequestContext(httpContext, errorRoute));
return new EmptyResult();
}
ErrorController 所做的只是记录错误并返回带有友好错误消息的视图。嗯,这就是它应该的工作方式。但在这种情况下,错误处理将进入一个无限循环,其中 AccountController(我的表单发布到的)将一遍又一遍地调用 HandleUnknownAction。
错误日志中没有任何内容表明出了什么问题(我想我只记录了所有内容)——这也很奇怪。所以我认为如果从我的控制器基类中删除 HandleUnknownAction 方法,可能会显示其他内容。它是:
2010-12-10 19:11:47,956 [4] 错误 Infrastructure.Log4NetAuditor [System.Web.HttpException (0x80004005):执行处理程序“System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper”的子请求时出错. ---> System.Web.HttpException (0x80004005): 子请求执行失败。请检查 InnerException 以获取更多信息。 ---> System.Web.HttpException (0x80004005):在控制器“Cdo.Web.Controllers.AccountController”上找不到公共操作方法“LoginForm”。
什么?当我看到这个时,我记得我已经将 HttpGetAttribute 放在了这个方法上——所以我立即删除了它......并且恢复了秩序。我很高兴发现 是什么 造成了这种情况 - 但我仍然对它发生的原因一无所知。如果您能够帮助我阐明这一点,我将不胜感激。为什么 HttpGetAttribute 会在这里有所作为?
【问题讨论】:
-
很难理解上面的例子。 “然而,问题只存在于一个特定的场景中——这让我感到困惑。当将表单发布到控制器时,只要控制器操作返回 RedirectToRouteResult,一切都会正常工作。如果操作只返回 ViewResult(到它的默认视图),我的 Http404 错误处理将启动并永远循环。”哪个动作。引用了“表格”。哪种形式?将什么发布到什么控制器方法时?您是否尝试使用相同的方法发布? LoginForm 视图重新存储到哪个操作?有问题吗?
标签: error-handling asp.net-mvc-3 infinite-loop http-get