问题描述
几天前,我们将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());