Error handling Html.Action调用[HttpGet]属性的操作时出现问题

Error handling Html.Action调用[HttpGet]属性的操作时出现问题,error-handling,asp.net-mvc-3,infinite-loop,http-get,Error Handling,Asp.net Mvc 3,Infinite Loop,Http Get,我刚刚遇到一个奇怪的问题。我已经修好了,但我希望你能帮助我更好地理解到底出了什么问题。我先解释一下发生了什么事。问题涉及一个简单的MVC3 RC1应用程序 在我的应用程序母版页中,调用控制器上的操作以呈现登录表单: @Html.Action("LoginForm", "Account") AccountController类上的action方法返回包含登录表单的PartialViewResult public PartialViewResult LoginForm() { return

我刚刚遇到一个奇怪的问题。我已经修好了,但我希望你能帮助我更好地理解到底出了什么问题。我先解释一下发生了什么事。问题涉及一个简单的MVC3 RC1应用程序

在我的应用程序母版页中,调用控制器上的操作以呈现登录表单:

@Html.Action("LoginForm", "Account")
AccountController类上的action方法返回包含登录表单的PartialViewResult

public PartialViewResult LoginForm()
{
    return PartialView();
}
今天,我对这个操作方法进行了更改,并将其与HttpGetAttribute联系起来,如下所示:

[HttpGet]
public PartialViewResult LoginForm()
{
    return PartialView();
}
这就是问题的根源。然而,这些问题只存在于一个特定的场景中——这就是让我困惑的地方。当向控制器发布表单时,只要控制器操作返回RedirectToRouteResult,一切都会正常工作。如果操作只是返回了一个ViewResult(到它的默认视图),我的Http404错误处理将永远启动并循环

我以一种非常类似于这个问题的第三个答案中描述的方式实现了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();
}
protected override void HandleUnknownAction(字符串actionName)
{
//如果控制器出错,控制器不“嵌套”异常
if(this.GetType()!=typeof(ErrorController))
调用ehttp404(HttpContext);
}
公共操作结果调用EHTTP404(HttpContextBase httpContext)
{
IController errorController=DependencyResolver.Current.GetService();
var errorRoute=新路由数据();
errorRoute.Values.Add(“控制器”、“错误”);
errorRoute.Values.Add(“操作”,“Http404”);
errorRoute.Values.Add(“url”,httpContext.Request.url.OriginalString);
执行(新的请求上下文(httpContext,errorRoute));
返回新的EmptyResult();
}
ErrorController所做的只是记录错误并返回一个带有友好错误消息的视图。嗯,这就是它的工作原理。但是在这种情况下,错误处理将进入一个无限循环,在这个循环中,AccountController(我的表单被发布到了其中)将一次又一次地调用HandleUnknownAction

错误日志中没有任何东西表明出了什么问题(我想我几乎记录了所有的事情)——这也很奇怪。所以我想,如果从我的控制器基类中删除HandleUnknownAction方法,可能会发现其他一些东西。它是:

2010-12-10 19:11:47956[4]ERROR 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为什么会做出错误的决定这里有什么不同?

尝试将outputcache属性设置为action。我记得这类问题,这是一个解决方案。将duration设置为1

[OutputCache(Duration = 1, VaryByParam = "None")]

上面的情况很难理解。“然而,问题只存在于一个特定的场景中,这让我感到困惑。当向控制器发布表单时,如果控制器操作返回RedirectToRouteResult,一切都会正常工作。如果该操作只返回ViewResult(到其默认视图),我的Http404错误处理将永远启动并循环。“哪个操作。引用了“一个表单”。哪个表单?在将什么发布到哪个控制器方法时?您是否尝试发布到同一个方法?LoginForm视图将返回到哪个操作?是否存在问题?