2sxc DnnEnvironment.get_DefaultLanguage

问题描述

几天前,我们将2sxc从9.33.0版本更新到了11.7.3。而且,在运行ToSic.SexyContent.Environment.Dnn7.Factory.App(appId,portalSettings)时,在自定义dnn模块的计划任务中,会出现以下错误

EXCEPTIONSystem.NullReferenceException: Object reference not set to an instance of an object. at ToSic.SexyContent.Environment.DnnEnvironment.get_DefaultLanguage() in C:\Projects\2sxc-dnn742\Website\DesktopModules\ToSIC_SexyContent\2sxc Dnn\Environment\DnnEnvironment.cs:line 28 at ToSic.Eav.Persistence.Efc.Efc11Loader.LoadEntities(AppDataPackage app,Int32[] entityIds) at ToSic.Eav.Persistence.Efc.Efc11Loader.<>c__displayClass5_0.b__0() at ToSic.Eav.App.AppDataPackage.Load(Log parentLog,Action loader) in C:\Projects\eav-server\ToSic.Eav.Core\App\AppDataPackage.cs:line 181 at ToSic.Eav.Persistence.Efc.Efc11Loader.Update(AppDataPackage app,AppPackageLoadingSteps startAt,Int32[] entityIds,Log parentLog) at ToSic.Eav.Persistence.Efc.Efc11Loader.AppPackage(Int32 appId,Log parentLog) at ToSic.Eav.DataSources.Caches.BaseCache.EnsureCache() in C:\Projects\eav-server\ToSic.Eav.DataSources\Caches\BaseCache.cs:line 96 at ToSic.Eav.Apps.App..ctor(Int32 zoneId,Int32 appId,Boolean allowSideEffects,Func`2 buildConfiguration,Log parentLog,String logMsg) at ToSic.Eav.Apps.App..ctor(IAppEnvironment env,ITenant tenant,Int32 zoneId,Log parentLog) at ToSic.SexyContent.Environment.Dnn7.Factory.App(Int32 appId,PortalSettings ownerPortalSettings,Boolean versioningEnabled,Boolean showDrafts) in C:\Projects\2sxc-dnn742\Website\DesktopModules\ToSIC_SexyContent\2sxc Dnn\Environment\Dnn7\Factory.cs:line 55 

从9.33.0版更新到9.35版时,我们检测到一个非常相似的错误

环境:

  • DNN:09.07.01 2sxc:11.7.3。

  • 目标框架自定义dnn模块:.NET Framework 4.7.2

解决方法

欢迎使用StackOverflow:)

您发布的错误几乎是不可读的(全部一行),因此很难找出任何东西。

我的猜测是,由于您正在执行计划任务,因此系统没有当前的PortalSettings,这对于获取当前语言等操作通常是必需的。这些错误有时会在较大的2sxc更改之后发生,然后通常会在搜索中弹出(这是计划任务)。但是您的情况可能更复杂,所以我不知道。

在不知道具体细节的情况下,很难给出提示,但是在这种情况下,可能是2sxc中的一个bug,无法解决后备问题。建议您尝试更详细地解决问题,或者找人来帮助您。

,

感谢您的回复。

我一直在调试2sxc源代码,当您在Factory.cs中运行以下命令时,似乎出现了该问题

var appStuff = app.Init(new AppIdentity(zoneId,appId),ConfigurationProvider.Build(showDrafts,publishingEnabled,new LookUpEngine(parentLog)),true,parentLog);

这会在下一行的DnnTenant.cs中产生错误。

public override string DefaultLanguage => _defaultLanguage ?? (_defaultLanguage = UnwrappedContents.DefaultLanguage.ToLowerInvariant());

错误消息如下:

EXCEPTIONSystem.NullReferenceException:对象引用未设置为 对象的实例。在 ToSic.SexyContent.Environment.DnnEnvironment.get_DefaultLanguage()在 C:\ Projects \ 2sxc-dnn742 \ Website \ DesktopModules \ ToSIC_SexyContent \ 2sxc Dnn \ Environment \ DnnEnvironment.cs:第28行

我强调,该错误似乎会在一段时间后解决,但在清除缓存并重新启动Dnn后,它会再次出现。

我怀疑这与UnwrappedContents变量有关。

我在源代码中没有找到调试Eav.Factory.Resolve<App>()方法的方法。 Eav.Factory.Resolve<App>()方法的代码在哪里?

,

正如@iJungleBoy所说,执行计划任务时,系统没有当前的PortalSettings。我知道SxcApiController需要DNN上下文,同时它是从DnnApiController继承的。确保存在DNN上下文的唯一方法是发布端点并从计划的任务发出请求。 这是因为当您从继承自DnnApiController的控制器中调用端点时,DNN使用该请求来创建上下文和当前的PortalSettings。

您可以从计划任务中执行以下操作:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("YOUR_CONTROLLER_ENDPOINT");
request.Method = "GET";
request.ContentType = "application/json; charset=utf-8";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream streamResponse = response.GetResponseStream();

// Deserialize response
var myEndpointResponse = JsonConvert.DeserializeObject<MyResponseObject>(new StreamReader(streamResponse).ReadToEnd());

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...