【问题标题】:Umbraco - Get an error when try to save content using ContentServiceUmbraco - 尝试使用 ContentService 保存内容时出错
【发布时间】:2014-05-09 06:53:17
【问题描述】:

应用程序启动后,我正在使用 ApplicationEventHanlder 创建内容。这是我的代码

公共类 CreateContent : ApplicationEventHandler { protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { var root = applicationContext.Services.ContentService.GetRootContent(); var content = applicationContext.Services.ContentService.CreateContent("Profile", -1, "umbTextPage"); applicationContext.Services.ContentService.Save(内容); base.ApplicationStarted(umbracoApplication, applicationContext); } } [NullReferenceException:对象引用未设置为对象的实例。] Umbraco.Core.Security.AuthenticationExtensions.GetCurrentIdentity(HttpContextBase http, Boolean authenticateRequestIfNotFound) +127 Umbraco.Web.Security.WebSecurity.GetUserId() +55 Umbraco.Web.Security.WebSecurity.get_CurrentUser() +63 Umbraco.Web.NotificationServiceExtensions.SendNotification(INotificationService 服务,IUmbracoEntity 实体,IAction 动作,UmbracoContext umbracoContext,ApplicationContext applicationContext)+221 Umbraco.Web.NotificationServiceExtensions.SendNotification(INotificationService 服务,IUmbracoEntity 实体,IAction 动作,UmbracoContext umbracoContext)+118 Umbraco.Web.NotificationServiceExtensions.SendNotification(INotificationService 服务,IUmbracoEntity 实体,IAction 动作,ApplicationContext applicationContext)+111 Umbraco.Web.Strategies.c__DisplayClass7.b__2(IContentService 发件人,SaveEventArgs`1 args)+219 Umbraco.Core.Events.TypedEventHandler`2.Invoke(TSender sender, TEventArgs e) +0 Umbraco.Core.Events.EventExtensions.RaiseEvent(TypedEventHandler`2 eventHandler, TArgs args, TSender sender) +48 Umbraco.Core.Services.ContentService.Save(IContent 内容,布尔 changeState,Int32 userId,布尔 raiseEvents)+632 Umbraco.Core.Services.ContentService.Save(IContent 内容,Int32 用户 ID,布尔 raiseEvents)+47 MyUmbraco.CreateContent.ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 在 c:\Users\duongdd\Documents\Visual Studio 2013\Projects\MyUmbraco\MyUmbraco\CreateContent.cs:19 Umbraco.Core.ApplicationEventHandler.OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) +62 Umbraco.Core.CoreBootManager.b__5(IApplicationEventHandler x) +79 Umbraco.Core.EnumerableExtensions.ForEach(IEnumerable`1 项,Action`1 动作)+204 Umbraco.Core.CoreBootManager.Complete(Action`1 afterComplete) +185 Umbraco.Web.WebBootManager.Complete(Action`1 afterComplete) +74 Umbraco.Core.UmbracoApplicationBase.StartApplication(对象发送者,EventArgs e)+242 Umbraco.Core.UmbracoApplicationBase.Application_Start(对象发送者,EventArgs e)+40 [HttpException (0x80004005): 对象引用未设置为对象的实例。] System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext 上下文,HttpApplication 应用程序)+572 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext,HttpContext 上下文,MethodInfo[] 处理程序)+178 System.Web.HttpApplication.InitSpecial(HttpApplicationState 状态,MethodInfo[] 处理程序,IntPtr appContext,HttpContext 上下文)+218 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +369 System.Web.HttpApplicationFactory.GetPipelineApplicationInstance(IntPtr appContext, HttpContext context) +102 System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +275 [HttpException (0x80004005): 对象引用未设置为对象的实例。] System.Web.HttpRuntime.FirstRequestInit(HttpContext 上下文) +761 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext 上下文)+150 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest WR,HttpContext 上下文)+245

有没有人遇到这个错误并提供解决方案?

谢谢!

【问题讨论】:

  • 这是哪个版本的 Umbraco?从堆栈跟踪来看,通知服务导致了一些问题,但之前从未见过此类问题。
  • 感谢@sitereactor。是的,你是对的。我下载了源代码并调试,通知服务在尝试保存或发布内容时导致问题。它不会从 WebSecurity 获取当前用户。我正在使用 Umbraco 7.1.1

标签: umbraco


【解决方案1】:

该问题似乎已得到修复 - 至少部分修复:https://github.com/umbraco/Umbraco-CMS/commit/ac88da4188365b101debf0f3e9ad7ec7c300a898 即将发布的 7.1.3 补丁版本。

我说部分是因为我认为这里有两个问题:

  1. 您发布的异常是围绕 CurrentUser,它不会 使用 API 时存在。此问题尚未修复。

  2. 由于涉及到一些遗留代码,用于发送通知的 NotificationService 需要 HttpContext。这在上述提交中已修复,因此如果 HttpContext 不可用,则不会发送通知。

但幸运的是,您提供的代码示例中有一种解决方法。 ContentService 中的 Save 方法有一个重载,以指定该方法不应引发事件。当您不为 Save 方法引发事件时,将不会调用 NotificationService 并且不会发生异常。但当然,这也意味着不会为您使用 API 从代码创建的内容项发送任何通知。

例子:

public class CreateContent : ApplicationEventHandler
{
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        var root = applicationContext.Services.ContentService.GetRootContent();

        var content = applicationContext.Services.ContentService.CreateContent("Profile", -1, "umbTextPage");

        applicationContext.Services.ContentService.Save(content, 0, false);

        base.ApplicationStarted(umbracoApplication, applicationContext);
    }
}

请注意,applicationContext.Services.ContentService.Save(content, 0, false); 包含两个额外的参数:0 表示用户 ID(零通常是管理员用户,始终存在),而 false 表示 raiseEvents = false。

使用此方法应确保您的代码不会调用 NotificationService,然后引发异常。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    相关资源
    最近更新 更多