Как DefaultControllerFactory обрабатывает запросы содержимого - PullRequest
1 голос
/ 03 февраля 2012

Я работаю с платформой ASP.Net MVC 3 и интегрирую внедрение зависимостей в приложение. Я пытаюсь создать собственную фабрику контроллеров. Самой большой проблемой, с которой я сталкиваюсь в данный момент, является моя реализация IControllerFactory.CreateController получает пропущенные запросы на такие вещи, как css, javascript и другие файлы содержимого, что впоследствии приводит к возникновению исключения в качестве типа для «Scripts / html5.js». не существует Код был унаследован мне, так что оставьте любую критику в отношении самого случайного состояния. Вот реализация:

    public virtual IController CreateController(RequestContext requestContext, string controllerName)
    {
        if (requestContext == null)
        {
            throw new ArgumentNullException("requestContext");
        }

        if (String.IsNullOrEmpty(controllerName))
        {
            throw new ArgumentException("Value cannot be null or empty", "controllerName");
        }

        this.RequestContext = requestContext;
        try
        {
            return container.Resolve<IController>(controllerName.ToLower());
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.Message);
            return innerFactory.CreateController(requestContext, controllerName);
        }
    }

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Я смог решить эту проблему, унаследовав от DefaultControllerFactory вместо полной реализации IControllerFactory:

public class MyControllerFactory : DefaultControllerFactory

Тогда мне нужно было только переопределить метод GetControllerInstance, чтобы подключить и вернуть любойэкземпляры из моего контейнера Unity:

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        IController controller = null;
        if (controllerType == null)
        {
            throw new HttpException(404, String.Format("The controller for path '{0}' could not be found or it does not implement IController.", requestContext.HttpContext.Request.Path));
        }

        if (!typeof(IController).IsAssignableFrom(controllerType))
        {
            throw new ArgumentException(String.Format("Type requested is not a controller: {0}", controllerType.Name), "controllerType");
        }

        try
        {
            if (this.container.IsRegistered(controllerType))
            {
                controller = this.container.Resolve(controllerType) as IController;
            }
            else
            {
                controller = base.GetControllerInstance(requestContext, controllerType);
            }
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(String.Format("Error resolving controller {0}", controllerType.Name, ex));
        }

        return controller;
    }
0 голосов
/ 03 февраля 2012

Есть несколько вещей, которые вы можете попробовать здесь:

routes.IgnoreRoute("{file}.css"); //plus others if you have specifics

или еще лучше, просто попробуйте

routes.RouteExistingFiles = false;
...