【问题标题】:Sitecore Could not create controller : Sitecore.Mvc.Diagnostics.ControllerCreationExceptionSitecore 无法创建控制器:Sitecore.Mvc.Diagnostics.ControllerCreationException
【发布时间】:2020-04-30 22:39:33
【问题描述】:

我正在使用 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'。这 当前路由 url 是:'{*pathInfo}'。这是默认的 Sitecore 在 'InitializeRoutes' 处理器中设置的路由 “初始化”管道。 ---> Sitecore.Mvc.Diagnostics.ExceptionWrapper: 路径“/”的控制器未找到或未实现 控制器。在 System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,类型控制器类型)在 System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,字符串控制器名称)在 Sitecore.Mvc.Controllers.SitecoreControllerFactory.CreateController(RequestContext requestContext,字符串控制器名称) --- 内部异常堆栈跟踪结束 --- 在 Sitecore.Mvc.Controllers.SitecoreControllerFactory.CreateController(RequestContext requestContext,字符串控制器名称)在 Sitecore.Mvc.Controllers.ControllerRunner.GetController() 在 Sitecore.Mvc.Controllers.ControllerRunner.Execute() 在 Sitecore.Mvc.Pipelines.Request.RequestBegin.ExecuteFormHandler.ExecuteHandler(字符串 controllerName, String actionName, RequestBeginArgs args) at (Object , 对象 [] ) 在 Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) 在 Sitecore.Pipelines.DefaultCorePipelineManager.Run(字符串 pipelineName, PipelineArgs args, String pipelineDomain) at 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);
    }
}

【问题讨论】:

  • 显示导致问题的控制器。它有依赖关系吗?他们都正确注册了吗?大多数情况下发生这种情况是因为控制器工厂无法解析控制器的所有必要依赖项。

标签: c# sitecore sitecore-mvc


【解决方案1】:

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

【讨论】:

  • 我用 DI 设置更新了我原来的问题,那里有问题吗?
  • @MicroMan 您能否通过sitecore/admin/showservicesConfig.aspx 检查正在运行的 DI 配置以确保控制器已注册。
  • 那里注册了很多服务,我不确定是哪个导致了问题,我只是在我的记录器中看到很多错误,没有指定哪个控制器?
  • @MicroMan 我假设您已经创建了一个 Sitecore 项目 + 为其分配了控制器渲染,对吗?控制器渲染定义项定义要使用的控制器类型。您可以验证要创建的类型是否显示在 showServices 中,以及所有依赖项。
【解决方案2】:

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

背景

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

问题

除了 2 之外,我的所有控制器都在加载。在我绞尽脑汁几个小时后,发现这 2 个控制器中有拼写错误。

解决方案

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多