2009-05-31 5 views
2

У меня есть StructureMap, работающий отлично на моей машине. Все отлично работает ... пока я не запрошу ресурс, которого нет. Вместо 404 я получаю 500 ошибок.Проблемы с ASP.NET MVC и StructureMap

например. http://localhost:6969/lkfhklsfhskdfksdf

Проверка сети, мне сообщили fix my structuremap controller class. Это и радость! Теперь я получаю: оригинальная страница 404 желтого экрана по умолчанию -. Хорошо, это лучше, чем моя страница с ошибками 500.

НО, я хочу, чтобы перейти к моим 404 странице :(Если я называю плохое действие на легальный контроллере, я получаю мои пользовательскую страницу 404.

В моей global.asax я быть_наст свои собственные маршруты , то по умолчанию, а затем, наконец, 404 маршрут:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Post", action = "Index", id = "" } // Parameter defaults 
    ); 

// Invalid/Unknown route. 
routes.MapRoute(
    "404-ResourceNotFound", 
    "{*url}", 
    new { controller = "StaticContent", action = "ResourceNotFound" } 
    ); 

Вот мой StructureMap код контроллера:

public class StructureMapControllerFactory: DefaultControllerFactory { 
    protected override IController GetControllerInstance(Type controllerType) { 
     if (controllerType != null) { 
      return ObjectFactory.GetInstance(controllerType) as Controller; 
     return base.GetControllerInstance(controllerType); 
    } 
} 

Любые идеи, есть какой-то способ, которым я мог бы каким-то образом получить структуру карты контроллера фа? ctory, чтобы пузыриться обратно в список маршрутов global.asax? или я сделал что-то действительно плохое, и мне нужно исправить некоторые другие вещи.

ура!

ответ

2

mmm ... похоже похоже может быть исключение предмет. подобно тому, как MVC предназначен для обработки ошибок 404 через исключения.

вот мой код:

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
     IController result = null; 
     try 
     { 
      result = ObjectFactory.GetInstance(controllerType) as Controller; 
     } 
     catch (StructureMapException) 
     { 
      System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave()); 
      throw; 
     } 

     return result; 
    } 
} 

.. Вы, возможно, даже если бы это и изменил его. Если нет, попробуйте и посмотрите, есть ли разница. Я не подозреваю, что будет.

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

(примечание стороны:.? Это странно, как я держать спотыкаясь на вопросы Krome Что г у работающих на)

EDIT: Я попробовал запрос одеяния и получил то же исключение. Поэтому я обновил свой класс, как вы.

Мой новый класс:

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
     if (controllerType == null) 
      return base.GetControllerInstance(controllerType); 

     IController result = null; 
     try 
     { 
      result = ObjectFactory.GetInstance(controllerType) as Controller; 
     } 
     catch (StructureMapException) 
     { 
      System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave()); 
      throw; 
     } 

     return result; 
    } 
} 

..выполняется, кажется, дает мне обратно 404, как она должна .. но я никогда не получить пользовательские страницы ошибок в развитии (локально) .. я должен ждать, пока Я публикую до того, как я их получу. Вы привыкли видеть пользовательские страницы ошибок в dev?

+1

Я на самом деле работает около 5 сайтов на данный момент :(Повторное свертывание одного, 4 - новые. :(Кроме того, с вашим кодом у меня тоже было это. Что происходит, когда u goto url like: http : // localhost: 12345/sfsfkasfhasklfla (например, ваш локальный хост и порт, а затем uri, который НЕ соответствует любому контроллеру. Создает ли ваш StructureMapControllerFactory исключение? –

+0

Мое приложение попадает на страницу пользовательских ошибок по умолчанию при производстве .. но не потому что у меня есть «404 маршрут» для него. Я думаю, что его внутренний дизайн MVC. Почему у вас есть этот маршрут 404? –

+0

Итак, я могу отправить peeps на свою собственную страницу 404 –