ASP.NET MVC - Обработка 404: SessionStateTempDataProvider требует, чтобы SessionState был включен - PullRequest
2 голосов
/ 21 октября 2009

У меня настроена обработка ошибок, как описано здесь: Как правильно обработать 404 в ASP.NET MVC?

Когда вызывается метод errorController.Execute, я получаю исключение InvalidOperationException: SessionStateTempDataProvider требует, чтобы SessionState был включен.

Мой режим состояния сеанса установлен на InProc, но я не использую его, поэтому я также попытался отключить его, как описано здесь: Как отключить состояние сеанса в ASP.NET MVC? Код выполняется, но я все еще получаю ошибку.

Это происходит локально с использованием встроенного веб-браузера Visual Studio.

Есть ли способ это исправить?

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Если вы хотите оставить состояние сеанса включенным, попробуйте добавить следующее к <system.webServer> <modules>:

<add name="SessionStateModule" type="System.Web.SessionState.SessionStateModule" />
0 голосов
/ 05 ноября 2009

Эта проблема может быть исправлена ​​путем переопределения метода ExecuteCore в вашем ErrorController. Очевидно, что некоторые виды ошибок (например, запрещенный доступ к файлу) не полностью заполняют 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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...