SiteCore Не удалось создать контроллер: Sitecore. Mvc .Diagnostics.ControllerCreationException - PullRequest
1 голос
/ 14 января 2020

Я использую sitecore v9

У меня есть два базовых класса для всех моих контроллеров следующим образом

public abstract SiteCoreController : ControllerBase, IController, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IAsyncManagerContainer

public abstract class ControllerBase : IController

все контроллеры используют что-то вроде

public class MyPageController : SiteCoreController 

In мои файлы журналов я получаю кучу ошибок

Sitecore. Mvc .Diagnostics.ControllerCreationException: Не удалось создать контроллер: Элемент контекста: '/ sitecore / content / TEST / home'. URL текущего маршрута: '{* pathInfo}'. Это маршрут Sitecore по умолчанию, который устанавливается в процессоре InitializeRoutes конвейера инициализации. ---> Sitecore. Mvc .Diagnostics.ExceptionWrapper: Контроллер для пути '/' не найден или не реализует IController. в System.Web. Mvc .DefaultControllerFactory.GetControllerInstance (RequestContext requestContext, Тип controllerType) в System.Web. Mvc .DefaultControllerFactory.CreateController (RequestContext requestContext, String controllerName * 10CrollerCoreCoreCoreler.CoreCoreler.CoreCoreler.CoreCoreler.CoreCoreler.CoreCoreler.CoreCoreler.CoreCoreler.CoreCorelerCoreCorelerCoreCorelerCoreCorelerCoreCorelerCoreCorelerCoreCorelerCoreCorelerCoreCorelerCoreCore.dll)))). (RequestContext requestContext, String controllerName) --- Конец внутренней трассировки стека исключений --- в Sitecore. Mvc .Controllers.SitecoreControllerFactory.CreateController (RequestContext requestContext, String controllerName) в Sitecore. Mvc .Controllers.ControllerRunner. () в Sitecore. Mvc .Controllers.ControllerRunner.Execute () в Sitecore. Mvc .Pipelines.Request.RequestBegin.ExecuteFormHandler.ExecuteHandler (String controllerName, String actionName, RequestBeginArgs args) в объекте (объект, аргументы []]) в Sitecore.Pipelines.CorePipeline.Run (Аргументы PipelineArgs) в Sitecore.Pipelines.DefaultCorePipelineManager.Run (Строковое значение pipeName, Аргументы PipelineArgs, Строковое значение pipeDom ain) в Sitecore. Mvc .Pipelines.PipelineService.RunPipeline [TArgs] (String pipelineName, TArgs args) в Sitecore. Mvc .Routing.RouteHttpHandler.BeginProcessRequest (контекст HttpContext, объект AsyncCallback в объекте cb, Cb объекта AsyncCallback) .HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () на System.Web.HttpApplication.ExecuteStepImpl (шаг IExecutionStep) на System.Web.Http * приложение2 1014 * Мой DI настроен следующим образом

public static void SetupControllers(this IServiceCollection serviceCollection, params Assembly[] assemblyArray)
{
    var controllers = GetTypesImplementing<IController>(assemblyArray)
        .Where(controller => controller.Name.EndsWith("Controller", StringComparison.Ordinal));

    foreach (var x in controllers)
    {
        serviceCollection.AddTransient(x);
    }

    var apis = GetTypesImplementing<ApiController>(assemblyArray)
        .Where(controller => controller.Name.EndsWith("Controller", StringComparison.Ordinal));

    foreach (var x in apis)
    {
        serviceCollection.AddTransient(x);
    }
}

1 Ответ

0 голосов
/ 16 января 2020

Похоже, вы забыли зарегистрировать контроллер в Контейнер Sitecore DI .

Вот пример (Вариант 1: Просто используйте Контейнер Sitecore) .

В нашем проекте мы создали фиктивный атрибут ControllerAttribute для надевания контроллеров, который необходимо создать автоматически.

Далее - собственный Конфигуратор, который регистрирует типы из пространства имен в DI, как:

var enumerable = from type in assemblies.Where((Assembly assembly) => !assembly.IsDynamic).SelectMany(GetExportedTypes)
    where !type.IsAbstract && !type.IsGenericTypeDefinition
    select new
    {
        Lifetime = type.GetCustomAttribute<ControllerAttribute>()?.Lifetime,
        ServiceType = type,
        ImplementationType = type.GetCustomAttribute<ControllerAttribute>()?.ControllerType
    } into t
    where t.Lifetime.HasValue
    select t;
foreach (var item in enumerable)
{
    if (item.ImplementationType == null)
    {
        serviceCollection.Add(item.ServiceType, item.Lifetime.Value);
    }
    else
    {
        serviceCollection.Add(item.ImplementationType, item.ServiceType, item.Lifetime.Value);
    }
}
...