Kentico 11+ WebForms PortalEngine 和 WebObjectActivator

Kentico 11+ WebForms PortalEngine and WebObjectActivator

有没有人在 Kentico 11 hotfix 24 WebForms PortalEngine 网站上成功地将 DI 适配器设置为 HttpRuntime.WebObjectActivator

在 Global.asax Application_Start 上添加 https://www.nuget.org/packages/DependencyInjection.WebForms.Unity/ 任何 page/admin 请求都会为我产生以下错误:

[Exception: Only one page manager (CMSPageManager or CMSPortalManager) is allowed on the page.]
   CMS.PortalEngine.PortalContext.set_CurrentPageManager(IPageManager value) +90
   CMS.PortalEngine.Web.UI.CMSPortalManager..ctor() +210

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
   System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +328
   Unity.Processors.<>c__DisplayClass16_0.<GetResolverDelegate>b__0(BuilderContext& c) in C:\projects\unity\Container\src\Processors\Constructor\ConstructorResolution.cs:79
   Unity.Processors.<>c__DisplayClass8_0.<GetResolver>b__0(BuilderContext& c) in C:\projects\unity\Container\src\Processors\Abstracts\MemberProcessor.cs:162
   Unity.Processors.<>c__DisplayClass8_0.<GetResolver>b__0(BuilderContext& c) in C:\projects\unity\Container\src\Processors\Abstracts\MemberProcessor.cs:162
   Unity.Processors.<>c__DisplayClass8_0.<GetResolver>b__0(BuilderContext& c) in C:\projects\unity\Container\src\Processors\Abstracts\MemberProcessor.cs:162
   Unity.<>c__DisplayClass111_0.<OptimizingFactory>b__0(BuilderContext& c) in C:\projects\unity\Container\src\UnityContainer.Resolution.cs:271
   Unity.Strategies.BuildPlanStrategy.PreBuildUp(BuilderContext& context) in C:\projects\unity\Container\src\Strategies\BuildPlanStrategy.cs:88
   Unity.<>c.<.ctor>b__73_2(BuilderStrategy[] chain, BuilderContext& context) in C:\projects\unity\Container\src\UnityContainer.Resolution.cs:420
   Unity.Builder.BuilderContext.Resolve(Type type, String name, InternalRegistration registration) in C:\projects\unity\Container\src\Builder\Context\BuilderContext.cs:177
   Unity.Builder.BuilderContext.Resolve(Type type, String name) in C:\projects\unity\Container\src\Builder\Context\BuilderContext.cs:44
   Unity.Builder.BuilderContext.Resolve(ParameterInfo parameter, Object value) in C:\projects\unity\Container\src\Builder\Context\BuilderContext.cs:217
   Unity.Processors.<>c__DisplayClass7_0.<CreateParameterResolvers>b__0(BuilderContext& context) in C:\projects\unity\Container\src\Processors\Parameters\ParametersProcessor.cs:121
   Unity.Processors.<>c__DisplayClass16_0.<GetResolverDelegate>b__0(BuilderContext& c) in C:\projects\unity\Container\src\Processors\Constructor\ConstructorResolution.cs:77
   Unity.Processors.<>c__DisplayClass8_0.<GetResolver>b__0(BuilderContext& c) in C:\projects\unity\Container\src\Processors\Abstracts\MemberProcessor.cs:162
   Unity.Processors.<>c__DisplayClass8_0.<GetResolver>b__0(BuilderContext& c) in C:\projects\unity\Container\src\Processors\Abstracts\MemberProcessor.cs:162
   Unity.Processors.<>c__DisplayClass8_0.<GetResolver>b__0(BuilderContext& c) in C:\projects\unity\Container\src\Processors\Abstracts\MemberProcessor.cs:162
   Unity.<>c__DisplayClass111_0.<OptimizingFactory>b__0(BuilderContext& c) in C:\projects\unity\Container\src\UnityContainer.Resolution.cs:271
   Unity.Strategies.BuildPlanStrategy.PreBuildUp(BuilderContext& context) in C:\projects\unity\Container\src\Strategies\BuildPlanStrategy.cs:80
   Unity.<>c.<.ctor>b__73_1(BuilderContext& context) in C:\projects\unity\Container\src\UnityContainer.Resolution.cs:361
   Unity.UnityContainer.Unity.IUnityContainer.Resolve(Type type, String name, ResolverOverride[] overrides) in C:\projects\unity\Container\src\UnityContainer.IUnityContainer.cs:244
   Unity.UnityContainerExtensions.Resolve(IUnityContainer container, Type t, ResolverOverride[] overrides) in C:\projects\unity\Abstractions\src\Extensions\Container\UnityContainer.cs:913
   HouseofCat.DependencyInjection.WebForms.Unity.ContainerServiceProvider.GetService(Type serviceType) in C:\GitHub\personal\HouseofCat.DependencyInjection.WebForms.Unity\ContainerServiceProvider.cs:49
   ASP.cmspages_portaltemplate_aspx.__BuildControlplcRoot() in C:\GIT\tests\KenticoTests\CMS\CMSPages\PortalTemplate.aspx:0
   ASP.cmspages_portaltemplate_aspx.__BuildControlform() in C:\GIT\tests\KenticoTests\CMS\CMSPages\PortalTemplate.aspx:13
   ASP.cmspages_portaltemplate_aspx.__BuildControlTree(cmspages_portaltemplate_aspx __ctrl) in C:\GIT\tests\KenticoTests\CMS\CMSPages\PortalTemplate.aspx:1
   ASP.cmspages_portaltemplate_aspx.FrameworkInitialize() +54
   System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +48
   System.Web.UI.Page.ProcessRequest() +76
   System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) +24
   System.Web.UI.Page.ProcessRequest(HttpContext context) +62
   ASP.cmspages_portaltemplate_aspx.ProcessRequest(HttpContext context) +48
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +195
   System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +50
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +73

如果我不添加适配器,我不会收到任何错误,我无法真正说明为什么 PortalContext.CurrentPageManager 已经初始化,以便在构建 page/controls 时抛出该错误向上。

如果能帮助查明真相,我们将不胜感激。

更新 1

Application_Start 只是使用这个扩展方法:https://github.com/houseofcat/DependencyInjection.WebForms/blob/5bf89863f083eb4d0aebb65f0c3a9e06cfd633b5/src/DependencyInjection.WebForms.Unity/HttpApplicationExtensions.cs#L19 添加容器。

我还没有添加任何注册,容器中只有IUnityContainer注册。

如果您想在 Kentico 上使用 DI 和 HttpRuntime.WebObjectActivator,您需要 Kentico 12+。

我能够使用 Kentico 11.0 进行 WebForms 依赖注入。

原来我安装了微软的Nuget包Microsoft.AspNet.WebFormsDependencyInjection.Unity

然而,

Due to a breaking change in Unity.Abstractions going from 3.3.1 to 4.0.0

提到here I had to switch to DependencyInjection.WebForms.Unity

将 CMSApp 项目更新到 .NET 4.7.2 后,我认为我可以继续使用,但由于未注入依赖项,在尝试 运行 应用程序时收到错误。

将项目更新到4.7.2后发现,web.config中的<compilation>元素已更改为4.7.2,但<httpRuntime>元素没有。我也手动将它更新到 4.7.2,一切都开始工作了!

This Github 问题帮助我找到了解决方案。