tags:

views:

182

answers:

1

I have setup error handling as described here: http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/620559#620559

When the errorController.Execute method is called, I get an InvalidOperationException: The SessionStateTempDataProvider requires SessionState to be enabled.

My session state mode is set to InProc, but I'm not using it so I also tried turning it off as described here: http://stackoverflow.com/questions/884852/how-can-i-disable-session-state-in-asp-net-mvc The code is executed, but I still get the error.

This is happening locally using the Visual Studio built-in web browser.

Is there a way to fix this?

A: 

This problem can be fixed by overriding the ExecuteCore method in your ErrorController. Apparently some kinds of errors (e.g. forbidden file access) don't fully populate the HttpContext that's available to the error handler; in particular Context.Session == null, which causes the ExecuteCore method to choke trying to determine if there's any TempData that needs to be saved/loaded.

I decided I can live without TempData in my error controller; here is my implementation.

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();
  }
}
Keith Morgan