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

我正在使用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(RequestContext requestContext,类型为controllerType),位于 system.web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,字符串controllerName)在 Sitecore.Mvc.Controllers.SitecoreControllerFactory.CreateController(RequestContext requestContext,字符串controllerName) ---内部异常堆栈跟踪的结尾---在Sitecore.Mvc.Controllers.SitecoreControllerFactory.CreateController(RequestContext requestContext,字符串controllerName)在 Sitecore.Mvc.Controllers.ControllerRunner.getcontroller()位于 Sitecore.Mvc.Controllers.ControllerRunner.Execute()位于 Sitecore.Mvc.Pipelines.Request.RequestBegin.ExecuteFormHandler.ExecuteHandler(String controllerName,字符串actionName,RequestBeginArgs args)在(Object, 位于Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)的Object []) 在Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName,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 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);
    }
}
qqqboyqqq 回答:SiteCore无法创建控制器:Sitecore.Mvc.Diagnostics.ControllerCreationException

听起来您可能忘记了在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);
    }
}
,

不确定它是否与任何人相关,但我会发布我是如何修复它的:

背景

  1. 使用 GlassMapper 和 Microsoft DI 的 Sitecore 9.2。
  2. 螺旋解决方案模式。

问题

除了 2 个控制器之外,我的所有控制器都在加载。在我摸索了几个小时后,发现这 2 个控制器存在拼写错误。

解决方案

将控制器拼写错误名称PersonalizationContoller更改为PersonalizationController

据我所知,由于控制器名称中缺少“r”,DI 并未将其视为控制器,因此未注册。只需转到 /sitecore/admin/showservicesConfig.aspx 并检查您的控制器是否已注册 - 如果没有,则名称错误或控制器使用的依赖项未加载。

本文链接:https://www.f2er.com/2773198.html

大家都在问