Возникли проблемы с ASP.NET MVC и StructureMap - PullRequest
2 голосов
/ 31 мая 2009

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

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

Проверяя сеть, мне сказали исправить мой класс контроллера структуры . Сделал это и радость! теперь я получаю - оригинальную стандартную страницу 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" }
    );

Вот мой код контроллера структуры карты:

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

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

ура!

1 Ответ

2 голосов
/ 01 июня 2009

ммм ... кажется, это может быть исключением. подобно тому, как 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;
    }
}

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

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

(примечание: странно, как я спотыкаюсь о твоих вопросах, Кром. Над чем ты работаешь?)

РЕДАКТИРОВАТЬ: Я попытался запрос на одеяния и получил то же исключение. Поэтому я обновил свой класс, как и вы.

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

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?

...