ASP.NET MVC - 处理404:SessionStateTempDataProvider要求启用SessionState

时间:2009-10-21 17:24:33

标签: asp.net-mvc

我已按照此处所述设置错误处理:How can I properly handle 404 in ASP.NET MVC?

当调用errorController.Execute方法时,我得到一个InvalidOperationException:SessionStateTempDataProvider需要启用SessionState。

我的会话状态模式设置为InProc,但我没有使用它,所以我也尝试将其关闭,如下所述:How can I disable session state in ASP.NET MVC?代码已执行,但我仍然收到错误。

这是使用Visual Studio内置Web浏览器在本地进行的。

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果您要启用会话状态,请尝试将以下内容添加到<system.webServer> <modules>

<add name="SessionStateModule" type="System.Web.SessionState.SessionStateModule" />

答案 1 :(得分:0)

可以通过覆盖ErrorController中的ExecuteCore方法来解决此问题。显然,某些类型的错误(例如禁止文件访问)不能完全填充错误处理程序可用的HttpContext;特别是Context.Session == null,这会导致ExecuteCore方法阻塞尝试确定是否存在需要保存/加载的任何TempData。

我决定在错误控制器中没有TempData就能生活;这是我的实施。

public class ErrorController : Controller {
  protected override void ExecuteCore() {
    string actionName = RouteData.GetRequiredString("action");
    if (!ActionInvoker.InvokeAction(ControllerContext, actionName)) {
      HandleUnknownAction(actionName);
    }
  }

  [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
  public ViewResult InternalServerError() {
    Response.StatusCode = (int)HttpStatusCode.InternalServerError; // 500
    return View();
  }

  [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
  public ViewResult NotFound(string Path) {
    Response.StatusCode = (int)HttpStatusCode.NotFound; // 404
    ViewData["Path"] = Path;
    return View();
  }
}