2014-02-10 1 views
1

Я реализовал фабрику пользовательских контроллеров в ASP.NET MVC, и я зарегистрировал ее в global.ascx. Идея состоит в том, чтобы обрабатывать случай 404, а также исключения в конструкторах контроллера. Я знаю, что фабрика была назначена ASP.NET MVC, потому что по запросам я могу в нее вступить. Я вижу, что я возвращаю контроллер, который, как я думаю. Но почему, а почему, почему мой контроллер не используется? Но я думаю, что я получил бы обычное действие не найдено исключение, а не controller..conceptually мне интересно, если это даже правильное место, чтобы сделать это.Почему контроллер не использует контроллер, возвращенный этой фабрикой?

protected override IController GetControllerInstance 
    (RequestContext context, 
    Type controllerType) 
    { 
     IController controller = null; 

     try 
     { 
      controller = base.GetControllerInstance(context, controllerType); 
     } 
     catch (CurrentSessionException) 
     { 
      controller = new LoginController(); 
     } 
     catch (System.Web.HttpException) 
     { 
      controller = new ErrorController(); 
     } 
     catch (System.Exception) 
     { 
      controller = new ErrorController(); 
     } 

     return controller; 
    } 
+0

Можем ли мы увидеть класс для предоставленного вами метода и как вы зарегистрировали свой заводской контроллер? Я бы также упомянул, если вы не должны смотреть на ответы в [Как я могу правильно обрабатывать 404 в ASP.NET MVC?] (Http://stackoverflow.com/questions/619895/how-can-i -properly-ручка-404-в-Asp-сетчатой ​​MVC). –

+0

О, я прочитал пример в приведенной ссылке. Похоже, что простое объяснение состоит в том, что он не работает через Visual Studio Debugger, но работает как чемпион, когда его развертывают в IIS 7.5. –

+0

У меня не было проблем с использованием [IIS Express] (http://blogs.msdn.com/b/webdev/archive/2011/03/14/enabling-iis-express-support-in-vs-2010- sp1.aspx). –

ответ

0

Попробуйте вручную расчистке ошибки ваше выступление.

requestContext.HttpContext.ClearError(); 

В идеале это лучше всего обрабатывается как фильтр. MVC поставляется с HandleErrorAttribute, который вы можете подкласса. Вы бы переопределили метод OnException, а затем просто обработали логику по своему усмотрению.

Это то, что по умолчанию имеет MVC 3.

 public virtual void OnException(ExceptionContext filterContext) { 
     if (filterContext == null) { 
      throw new ArgumentNullException("filterContext"); 
     } 
     if (filterContext.IsChildAction) { 
      return; 
     } 

     // If custom errors are disabled, we need to let the normal ASP.NET exception handler 
     // execute so that the user can see useful debugging information. 
     if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled) { 
      return; 
     } 

     Exception exception = filterContext.Exception; 

     // If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method), 
     // ignore it. 
     if (new HttpException(null, exception).GetHttpCode() != 500) { 
      return; 
     } 

     if (!ExceptionType.IsInstanceOfType(exception)) { 
      return; 
     } 

     string controllerName = (string)filterContext.RouteData.Values["controller"]; 
     string actionName = (string)filterContext.RouteData.Values["action"]; 
     HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); 
     filterContext.Result = new ViewResult { 
      ViewName = View, 
      MasterName = Master, 
      ViewData = new ViewDataDictionary<HandleErrorInfo>(model), 
      TempData = filterContext.Controller.TempData 
     }; 
     filterContext.ExceptionHandled = true; 
     filterContext.HttpContext.Response.Clear(); 
     filterContext.HttpContext.Response.StatusCode = 500; 

     // Certain versions of IIS will sometimes use their own error page when 
     // they detect a server error. Setting this property indicates that we 
     // want it to try to render ASP.NET MVC's error page instead. 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
    } 
Смежные вопросы