1

本周早些时候,我公司的解决方案设计师最近向所有开发人员发出挑战,要求在他编写的某些代码中找到错误。发生的事情是,当出现问题并且整个应用程序池死机时,构建管理员从 SharePoint 收回了他的解决方案包。

推测其原因是以下之一:

  • 代码中的一些东西
  • 它是否与从 Central Admin 收回解决方案有关?
  • C——以上都不是
  • D - 以上所有

我今天一直在看代码,但没有找到任何歪斜的东西。我想我会把他的代码放在这里,并从任何有兴趣提供代码的人那里获得意见。这不是一个严肃的问题,并且挑战是在良好的运动中发出的,所以如果您有这种倾向,请注意它。

来自 SD 的消息:

正如我昨天在 DevDays 中提到的,当 SharePoint 管理员从 SharePoint 收回 CityDepartments 解决方案包时,整个 IIS 应用程序池都死了。这是在 OWSTIMER.EXE 计时器作业可以解锁所有 Web 应用程序和站点之前,它在实际功能被停用之前锁定。

所以,既然没有人知道出了什么问题,我会奖励第一个弄清楚的人(包括我自己)。

正如承诺的那样,如果您可以在导致 SharePoint 严重崩溃的功能停用事件之一中找到问题,就像上周一样,那么我将为您购买 2 张目前正在放映的 NuMetro 或 SterKinekor 电影的电影票。证明将在 DEV 和 QA 环境中成功部署和收回(确定为 3 次)固定解决方案包。


列出功能事件接收器:


using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Taxonomy;
using Microsoft.Office.DocumentManagement.MetadataNavigation;
using Microsoft.Office.Server.SocialData;

namespace CityDepartmentStructure.SharepointExtractTimerJob.Features.CityDepartmentsListFeature
{
    /// <summary>
    /// This class handles events raised during feature activation, deactivation, installation, uninstallation, and upgrade.
    /// </summary>
    /// <remarks>
    /// The GUID attached to this class may be used during packaging and should not be modified.
    /// </remarks>

    [Guid("ce0a04a0-b20b-4587-998a-6817dce2d4d8")]
    public class CityDepartmentsListFeatureEventReceiver : SPFeatureReceiver
    {
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            try
            {
                SPServiceContext context = SPServiceContext.GetContext(SPServiceApplicationProxyGroup.Default, SPSiteSubscriptionIdentifier.Default);
                SocialTagManager stm = new SocialTagManager(context);

                TaxonomySession taxonomySession = stm.TaxonomySession;
                TermStore termStore = taxonomySession.DefaultSiteCollectionTermStore;

                Group termGroup = termStore.Groups["CityDepartments"];
                TermSet termSet = termGroup.TermSets["Directorates"];

                using (SPWeb web = properties.Feature.Parent as SPWeb)
                {                                        
                    web.Lists.Add("DepartmentSites", "This list maintains a list of web sites for all Org Units in CCT", SPListTemplateType.Links);
                    web.Update();

                    SPList departmentsList = web.Lists["DepartmentSites"];                    

                    TaxonomyField taxonomyField = departmentsList.Fields.CreateNewField("TaxonomyFieldType", "OrgLevel") as TaxonomyField;
                    taxonomyField.Description = "Org Unit in the Org Structure. Can be a Directorate, Department, Branch or Section.";
                    taxonomyField.SspId = termStore.Id;
                    taxonomyField.TermSetId = termSet.Id;
                    taxonomyField.AllowMultipleValues = false;
                    taxonomyField.CreateValuesInEditForm = false;
                    taxonomyField.Open = false;
                    taxonomyField.Group = "CCT Metadata Field Content Type";
                    taxonomyField.Required = true;                    
                    departmentsList.Fields.Add(taxonomyField);

                    TaxonomyField field = departmentsList.Fields["OrgLevel"] as TaxonomyField;
                    field.Title = "OrgLevel";
                    field.Update(true);
                    departmentsList.Update();

                    SPView view = departmentsList.DefaultView;                    
                    view.ViewFields.Add("OrgLevel");
                    view.Update();

                    var navigationField = departmentsList.Fields["OrgLevel"] as SPField;
                    MetadataNavigationSettings navigationSettings = MetadataNavigationSettings.GetMetadataNavigationSettings(departmentsList);
                    MetadataNavigationHierarchy navigationHierarchy = new MetadataNavigationHierarchy(navigationField);
                    navigationSettings.AddConfiguredHierarchy(navigationHierarchy);
                    MetadataNavigationSettings.SetMetadataNavigationSettings(departmentsList, navigationSettings, true);
                    departmentsList.Update();

                    MetadataNavigationKeyFilter navigationKeyFilter = new MetadataNavigationKeyFilter(navigationField);
                    navigationSettings.AddConfiguredKeyFilter(navigationKeyFilter);
                    MetadataNavigationSettings.SetMetadataNavigationSettings(departmentsList, navigationSettings, true);
                    departmentsList.Update();
                }
            }
            catch (Exception ex)
            {
                throw ex; 
            }
        }       

        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            try
            {
                using (SPWeb web = properties.Feature.Parent as SPWeb)
                {
                    SPList departmentsList = web.Lists["DepartmentSites"];
                    departmentsList.Delete();                    
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }        
    }
}

计时器作业功能事件接收器:


using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using System.Linq;
namespace CityDepartmentStructure.SharepointExtractTimerJob.Features.Feature1
{
    /// <summary>
    /// This class handles events raised during feature activation, deactivation, installation, uninstallation, and upgrade.
    /// </summary>
    /// <remarks>
    /// The GUID attached to this class may be used during packaging and should not be modified.
    /// </remarks>

    [Guid("10e80e0f-7be3-46f0-8a7f-fcf806ddf762")]
    public class Feature1EventReceiver : SPFeatureReceiver
    {
        private const string JobName = "ExtractTimerJob";

        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPService service = GetService();

            // Remove job if it exists.
            DeleteJobAndSettings(service);

            // Create the job.
            ExtractTimerJob job = new ExtractTimerJob(JobName, service);

            // Create the schedule so that the job runs hourly, sometime 
            // during the first quarter of the hour.

            SPHourlySchedule schedule = new SPHourlySchedule();
            schedule.BeginMinute = 0;
            schedule.EndMinute = 15;
            job.Schedule = schedule;
            job.Update();

            // Configure the job.
            ExtractTimerJobSettings jobSettings = new ExtractTimerJobSettings(service, Guid.NewGuid());
            jobSettings.Name = "ExtractTimerJobSettings";
            jobSettings.WebServiceLocation = "http://r3pci01.capetown.gov.za:8150/sap/zget_orgstruct";
            jobSettings.Update(true);
        }

        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            DeleteJobAndSettings(GetService());
        }

        private void DeleteJobAndSettings(SPService service)
        {
            // Find the job and delete it.
            foreach (SPJobDefinition job in service.JobDefinitions)
            {
                if (job.Name == JobName)
                {
                    job.Delete();
                    break;
                }
            }

            // Delete the job's settings.
            ExtractTimerJobSettings jobSettings = service.GetChild<ExtractTimerJobSettings>("ExtractTimerJobSettings");
            if (jobSettings != null)
            {
                jobSettings.Delete();
            }
        }

        private static SPService GetService()
        {
            // Get an instance of the SharePoint farm.
            SPFarm farm = SPFarm.Local;

            // Get an instance of the service.
            var results = from s in farm.Services
                          where s.Name == "SPSearch4"
                          select s;

            SPService service = results.First();
            return service;
        }
    }
}
4

1 回答 1

1

如果没有日志,可能很难弄清楚到底发生了什么,但我猜想Disposing Properties.Feature.Parent 不是好主意

如果您是从 powershell 执行此操作,则可能会导致一些问题,因为它很可能总是会尝试使用相同的对象。

接下来是,使用您正在部署/收回解决方案的脚本。您是否每次都明确激活/停用功能?

更多过度 - 杀死应用程序池是部署和收回的正常行为,但再次启动它们的问题可能与某种超时有关 - 例如,应用程序池启动尝试在它真正关闭之前发生。

于 2014-07-04T12:57:39.177 回答