SP2013:SPDIagnosticsServiceBase.GetLocal上的SPDuplicateObjectException

问题描述 投票:1回答:1

我在SharePoint 2013服务器场上提供了自定义诊断服务,扩展了SPDiagnosticsServiceBase类。

using Microsoft.SharePoint.Administration;
using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace Custom.Sharepoint.Services.Logging
{
    [System.Runtime.InteropServices.Guid("DBEEB5AB-C5A7-46B5-A2BB-5581F960C333")]
    public class CustomLoggingService : SPDiagnosticsServiceBase
    {
        public static string CustomLoggingServiceName = "Custom Logging Service";
        public static string CustomLoggingServiceTypeName = "Custom Logs";

        public enum CategoryId
        {
            General = 0,
            Base = 100,
            QA = 200,
            Admin = 300
        }

        public CustomLoggingService()
        {

        }

        public CustomLoggingService(string name, SPFarm farm) : base(CustomLoggingServiceName, farm)
        {

        }

        public static CustomLoggingService Local
        {
            get
            {
                return GetLocal<CustomLoggingService>();
            }
        }

        public override string DisplayName
        {
            get
            {
                return CustomLoggingServiceName;
            }
        }

        public override string TypeName
        {
            get
            {
                return CustomLoggingServiceTypeName;
            }
        }

        protected override IEnumerable<SPDiagnosticsArea> ProvideAreas()
        {
            List<SPDiagnosticsCategory> categories = new List<SPDiagnosticsCategory>();
            foreach (string catName in Enum.GetNames(typeof(CategoryId)))
            {
                uint catId = (uint)(int)Enum.Parse(typeof(CategoryId), catName);
                categories.Add(new SPDiagnosticsCategory(catName, TraceSeverity.Verbose, EventSeverity.Error, 0, catId));
            }

            yield return new SPDiagnosticsArea(CustomLoggingServiceName, categories);
        }
        public SPDiagnosticsCategory this[CategoryId id]
        {
            get
            {
                return Areas[CustomLoggingServiceName].Categories[id.ToString()];
            }
        }

        public static void LogError(CategoryId category, string errorMessage, TraceSeverity severity)
        {
            SPDiagnosticsCategory cat = Local.Areas[CustomLoggingServiceName].Categories[category.ToString()];
            Local.WriteTrace(0, cat, severity, errorMessage);
        }
    }
}

当LogError方法中使用Local时,GetLocal方法将引发以下异常:

Microsoft.SharePoint.Administration.SPDuplicateObjectException:名为“ Custom Logging Service”的Custom.Sharepoint.Services.Logging.CustomLoggingService类型的对象已经存在于名为“ SharePoint_Config_825b764b-31e1-4f9e-”的父Microsoft.SharePoint.Administration.SPFarm下。 a722-558c56a5b0af”。重命名您的对象或删除现有对象。在Microsoft.SharePoint.Administration.SPConfigurationDatabase.StoreObject(SPPersistedObject obj,布尔值storeClassIfNecessary,布尔值确保)在Microsoft.SharePoint.Administration.SPConfigurationDatabase.Microsoft.SharePoint.Administration.ISPPersistedStoreProvider.PutObject(SPPersistedObjectpersistedObject,布尔值确保)在Microsoft.SharePoint.Administration.SPPersistedObject.BaseUpdate()在Microsoft.SharePoint.Administration.SPDiagnosticsServiceBase.Update()在Microsoft.SharePoint.Administration.SPDiagnosticsServiceBase.GetLocalToFarm [T](SPFarm场)在Custom.Sharepoint.Services.Logging.CustomLoggingService.get_Local()在Custom.Sharepoint.Services.Logging.CustomLoggingService.LogError(CategoryId类别,字符串errorMessage,TraceSeverity严重性)在Custom.Sharepoint.QA.Features.QAProbe.QAProbeEventReceiver.logToULS(字符串消息,TraceSeverity严重性)在Custom.Sharepoint.QA.Features.QAProbe.QAProbeEventReceiver.FeatureActivated(SPFeatureReceiverProperties属性)在Microsoft.SharePoint.SPFeature.DoActivationCallout(Boolean fActivate,布尔fForce)在Microsoft.SharePoint.SPFeature.Activate(SPSite siteParent,SPWeb webParent,SPFeaturePropertyCollection道具,SPFeatureActivateFlags activateFlags,布尔值fForce)

这里最棘手的部分是,仅当从FeatureActivated事件或计时器作业中调用LogError时,我才获得此异常。如果是从Webpart调用的,那么我没有任何问题。而且仅在一定时间后才发生。我确实安装了最新的SP更新并在服务器场上运行了PSConfigUI。我不能说这是确切原因。除此之外,我只在我的开发环境中遇到此问题,但现在我不想在产品上部署任何解决方案的更新并破坏所有内容。

异常显示GetLocal方法调用了GetLocalToFarm方法,但我尝试直接使用它,但得到的结果相同。

我坚称GetLocal实际上会获取现有对象的句柄,但是根据异常,它看起来像是试图创建它,并且由于它已经存在,所以它引发了异常……我需要使用本地对象,因为我希望就地使用日志记录服务,以便我们的管理员可以在CA中管理捕获的日志级别。 (我的自定义日志服务确实出现在CA的诊断日志记录配置中)

我使用这段代码记录来自其他定制解决方案任何部分的错误消息:

CustomLoggingService.LogError(CustomLoggingService.CategoryId.QA, "Message from the QA Solution in the ULS", TraceSeverity.High);

谢谢

c# exception sharepoint sharepoint-2013
1个回答
0
投票

您找到解决方案了吗?我有同样的问题。

protected static T GetLocalToFarm<T>(SPFarm farm) where T : SPDiagnosticsServiceBase, new()
    {
      if ((SPPersistedObject) farm == (SPPersistedObject) null)
        return default (T);
      T instance = farm.Services.GetValue<T>();
      if ((SPPersistedObject) instance == (SPPersistedObject) null)
      {
        lock (SPDiagnosticsServiceBase.s_syncRoot)
        {
          instance = farm.Services.GetValue<T>();
          if ((SPPersistedObject) instance == (SPPersistedObject) null)
          {
            instance = (T) Activator.CreateInstance(typeof (T), new object[2]
            {
              (object) "",
              (object) SPFarm.Local
            });
            instance.Update();
          }
        }
      }
      return instance;
    }

以某种方式找不到服务类型。不知道为什么。

© www.soinside.com 2019 - 2024. All rights reserved.