SiteCore无法创建控制器:Sitecore.Mvc.Diagnostics.ControllerCreationException

问题描述 投票:0回答:1

我正在使用sitecore v9

我的所有控制器都有两个基类,如下所示

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

public abstract class ControllerBase : IController

所有控制器都使用类似的东西

public class MyPageController : SiteCoreController 

在我的日志文件中,我得到很多错误

Sitecore.Mvc.Diagnostics.ControllerCreationException:无法创建控制器:上下文项为:“ / sitecore / content / TEST / home”。的当前路由网址为:“ {* pathInfo}”。这是默认的Sitecore路由,该路由是在服务器的“ InitializeRoutes”处理器中设置的“初始化”管道。 ---> Sitecore.Mvc.Diagnostics.ExceptionWrapper:找不到或未实现路径“ /”的控制器IController。在System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContextrequestContext,类型为controllerType),位于System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContextrequestContext,字符串controllerName)Sitecore.Mvc.Controllers.SitecoreControllerFactory.CreateController(RequestContextrequestContext,字符串controllerName)---内部异常堆栈跟踪的结尾---在Sitecore.Mvc.Controllers.SitecoreControllerFactory.CreateController(RequestContextrequestContext,字符串controllerName)Sitecore.Mvc.Controllers.ControllerRunner.GetController()位于Sitecore.Mvc.Controllers.ControllerRunner.Execute()位于Sitecore.Mvc.Pipelines.Request.RequestBegin.ExecuteFormHandler.ExecuteHandler(StringcontrollerName,字符串actionName,RequestBeginArgs args)在(Object,位于Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)的Object [])在Sitecore.Pipelines.DefaultCorePipelineManager.Run(StringpipelineName,PipelineArgs args,字符串pipelineDomain)位于Sitecore.Mvc.Pipelines.PipelineService.RunPipeline [TArgs](字符串pipelineName,TArgs args)在Sitecore.Mvc.Routing.RouteHttpHandler.BeginProcessRequest(HttpContext上下文,AsyncCallback cb,对象extraData)位于System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()在System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep步骤)System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)

我的DI设置如下

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

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

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

    foreach (var apiController in apiControllers)
    {
        serviceCollection.AddTransient(apiController);
    }
}
c# sitecore sitecore-mvc
1个回答
0
投票

听起来您可能忘记了在Sitecore DI container中注册控制器。

这里是an example (Option 1: Just use Sitecore’s Container)

在我们的项目中,我们创建了一个虚拟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);
        }
© www.soinside.com 2019 - 2024. All rights reserved.