我正在使用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);
}
}