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