2sxc DnnEnvironment.get_DefaultLanguage()

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:\Projectssxc-dnn742\Website\DesktopModules\ToSIC_SexyContentsxc 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, Int32[] entityIds, 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, Int32 appId, Boolean allowSideEffects, Func`2 buildConfiguration, Log parentLog) at ToSic.SexyContent.Environment.Dnn7.Factory.App(Int32 appId, PortalSettings ownerPortalSettings, Boolean versioningEnabled, Boolean showDrafts) in C:\Projectssxc-dnn742\Website\DesktopModules\ToSIC_SexyContentsxc Dnn\Environment\Dnn7\Factory.cs:line 55 

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

环境:

欢迎使用 Whosebug :)

您发布的错误几乎不可读(全部在一行上),所以很难找出任何东西。

我的猜测是,由于您 运行 在计划任务中,系统没有当前的 PortalSettings,而获取当前语言等通常需要它。这些错误有时会在较大的 2sxc 更改后发生,然后通常会在搜索中弹出(这是一项计划任务)。但是你的情况可能比较复杂,所以我不知道。

在不知道具体细节的情况下,很难给出提示,但这可能是 2sxc 中的一个错误,在这种情况下没有处理回退。我建议您尝试更详细地了解它或找人在您的网站上帮助您。

感谢您的回复。

我一直在调试 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: Object reference not set to an instance of an object. at ToSic.SexyContent.Environment.DnnEnvironment.get_DefaultLanguage() in C:\Projectssxc-dnn742\Website\DesktopModules\ToSIC_SexyContentsxc Dnn\Environment\DnnEnvironment.cs:line 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());