Поделиться через


Практическое руководство. Создание правила исправности

Дата последнего изменения: 16 октября 2009 г.

Применимо к: SharePoint Foundation 2010

В Microsoft SharePoint Foundation 2010 правило исправности создается путем написания кода для конкретного подкласса, который наследует от одного из двух абстрактных классов, SPHealthAnalysisRule или SPRepairableHealthAnalysisRule.

Для обоих базовых классов необходима реализация свойств Summary, Explanation, Remedy, Category и ErrorLevel, а также метода Check(). Для настраиваемых правил не следует устанавливать свойство ErrorLevel в значение Success или RuleExecutionFailure, поскольку эти значения предназначены только для внутреннего использования.

Чтобы обнаружить проблему, для поиска которой разработано правило, следует использовать метод Check. Если правило наследует от класса SPRepairableHealthAnalysisRule, то необходимо также реализовать метод Repair(). Это место размещения кода, который исправляет проблему, обнаруженную методом Check.

Если планируется устанавливать правило так, чтобы оно могло выполняться автоматически, то необходимо также переопределить и реализовать свойство AutomaticExecutionParameters. Это свойство предоставляет настройки по умолчанию для задания таймера, выполняющего это правило.

Создание правила исправности

  1. Откройте Visual Studio как администратор, щелкнув программу правой кнопкой мыши в меню Пуск и выбрав Запуск от имени администратора.

  2. Создайте новый проект библиотеки классов.

    В диалоговом окне Создание проекта выберите Visual C# или Visual Basic, далее нажмите Windows, а затем выберите шаблон Библиотека классов.

    Имя, данное этому проекту, используется в качестве пространства имен по умолчанию для этой сборки. В одной сборке можно развернуть несколько правил исправности, но в таком случае следует подумать о соответствующем именовании проекта, например назвать его CompanyNameHealthRules.

  3. Подпишите сборку.

    В окне Обозреватель решений щелкните правой кнопкой мыши имя проекта и выберите Свойства. На странице свойств нажмите Подписи, а затем установите флажок Подписать сборку. Перейдите в файл ключей строгого имени или создайте новый файл.

    Это действие необходимо, поскольку сборка должна быть установлена в глобальный кэш сборок на всех компьютерах прежде, чем будет выполнена ее регистрация в анализаторе работоспособности SharePoint. Сборки, которые устанавливаются в глобальный кэш сборок, должны быть подписаны строгим именем. Дополнительные сведения см. в практическом руководстве Подпись сборки строгим именем.

  4. Измените имя класса с Class1 на имя, описывающее ошибку, которую будет обнаруживать правило.

    В обозревателе решений щелкните правой кнопкой мыши файл Class1.cs или Class1.vb, выберите пункт Переименовать, а затем укажите новое имя. В ответ на вопрос, следует ли переименовать все ссылки на Class1, нажмите кнопку Да.

  5. Добавление ссылки на библиотеку Microsoft.SharePoint.dll

    В окне Обозреватель решений щелкните правой кнопкой мыши имя проекта и выберите пункт Добавление ссылки. В диалоговом окне Добавление ссылки перейдите к файлу %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI\Microsoft.SharePoint.dll. Выберите Microsoft.SharePoint.dll и нажмите кнопку ОК.

  6. Добавьте оператор using (Imports в Visual Basic) для пространства имен Microsoft.SharePoint.Administration.Health.

    using Microsoft.SharePoint.Administration.Health;
    
    Imports Microsoft.SharePoint.Administration.Health
    
  7. Измените объявление класса таким образом, чтобы он наследовал от класса SPHealthAnalysisRule или от класса SPRepairableHealthAnalysisRule.

    • Если вы работаете с Visual C#, перейдите в объявление класса. После имени класса введите двоеточие и имя класса, от которого должно наследовать правило. Затем нажмите клавиши Shift+Alt+F10. В ответ на вопрос, хотите ли вы реализовать класс, нажмите клавишу ВВОД. Заглушки членов, помеченных как abstract в базовом классе, добавляются в производный класс.

      В этой точке код библиотеки классов должен быть похож на код в следующем примере.

      using Microsoft.SharePoint.Administration.Health;
      
      namespace Samples.HealthRules
      {
          public class DiskDriveAlmostFull: SPHealthAnalysisRule
          {
              public override SPHealthCategory Category
              {
                  get { throw new System.NotImplementedException(); }
              }
      
              public override SPHealthCheckStatus Check()
              {
                  throw new System.NotImplementedException();
              }
      
              public override SPHealthCheckErrorLevel ErrorLevel
              {
                  get { throw new System.NotImplementedException(); }
              }
      
              public override string Explanation
              {
                  get { throw new System.NotImplementedException(); }
              }
      
              public override string Remedy
              {
                  get { throw new System.NotImplementedException(); }
              }
      
              public override string Summary
              {
                  get { throw new System.NotImplementedException(); }
              }
          }
      }
      
    • Если вы работаете с Visual Basic, в первой пустой строке под объявлением класса введите Inherits и имя класса, от которого должно наследовать правило. Затем нажмите клавишу ВВОД. Заглушки членов, помеченных как MustOverride в базовом классе, добавляются в производный класс.

      В этой точке код библиотеки классов должен быть похож на код в следующем примере.

      Imports Microsoft.SharePoint.Administration.Health
      
      Public Class DiskDriveAlmostFull
          Inherits SPHealthAnalysisRule
      
      
          Public Overrides ReadOnly Property Category() As Microsoft.SharePoint.Administration.Health.SPHealthCategory
              Get
      
              End Get
          End Property
      
          Public Overrides Function Check() As Microsoft.SharePoint.Administration.Health.SPHealthCheckStatus
      
          End Function
      
          Public Overrides ReadOnly Property ErrorLevel() As Microsoft.SharePoint.Administration.Health.SPHealthCheckErrorLevel
              Get
      
              End Get
          End Property
      
          Public Overrides ReadOnly Property Explanation() As String
              Get
      
              End Get
          End Property
      
          Public Overrides ReadOnly Property Remedy() As String
              Get
      
              End Get
          End Property
      
          Public Overrides ReadOnly Property Summary() As String
              Get
      
              End Get
          End Property
      End Class
      
  8. Напишите код для реализации членов abstract (в Visual Basic MustOverride) класса. Дополнительные сведения см. в документации по классам SPHealthAnalysisRule и SPRepairableHealthAnalysisRule.

  9. Переопределите и реализуйте свойство AutomaticExecutionParameters.

    В следующем примере показана реализация этого свойства для правила, которое должно запускаться ежечасно на всех серверах фермы.

    public override SPHealthAnalysisRuleAutomaticExecutionParameters AutomaticExecutionParameters
    {
        get
        {
            SPHealthAnalysisRuleAutomaticExecutionParameters retval =
                new SPHealthAnalysisRuleAutomaticExecutionParameters();
            retval.Schedule = SPHealthCheckSchedule.Hourly;
            retval.Scope = SPHealthCheckScope.All;
            retval.ServiceType = typeof(SPTimerService);
            return retval;
        }
    }
    
    Public Overrides ReadOnly Property AutomaticExecutionParameters() As Microsoft.SharePoint.Administration.Health.SPHealthAnalysisRuleAutomaticExecutionParameters
        Get
            Dim retval As SPHealthAnalysisRuleAutomaticExecutionParameters = _
                New SPHealthAnalysisRuleAutomaticExecutionParameters()
            retval.Schedule = SPHealthCheckSchedule.Hourly
            retval.Scope = SPHealthCheckScope.All
            retval.ServiceType = Type.GetType("Microsoft.SharePoint.Administration.SPTimerService")
            Return retval
        End Get
    End Property
    
  10. Скомпилируйте и протестируйте правило.

Сведения о подготовке нового правила исправности администратором фермы см. в руководстве Практическое руководство. Создание компонента для регистрации правила работоспособности.

Пример

В следующем примере показано правило исправности, которое раз в день проверяет каждый сервер в ферме, чтобы увидеть, не закончилось ли свободное место на жестких дисках.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Administration.Health;

namespace Samples.HealthRules
{
    public class DiskDriveAlmostFull: SPHealthAnalysisRule
    {
        private List<DriveInfo> m_FailingDrives = new List<DriveInfo>();

        public override string Summary
        {
            get { return "One or more disk drives are running out of free space."; }
        }

        public override string Explanation
        {
            get
            {
                StringBuilder sb = new StringBuilder();
                foreach (DriveInfo drive in this.m_FailingDrives)
                {
                    sb.AppendFormat("{0} ({1}), ",
                        drive.VolumeLabel, drive.Name);
                }
                if (sb.Length > 2)
                    sb.Remove(sb.Length - 2, 2);

                return string.Concat(
                    "The following drives on the failing servers have less than 10GB free: ", sb);
            }
        }

        public override string Remedy
        {
            get { return "Examine the failing servers and delete old logs or free space on the drives."; }
        }
        
        public override SPHealthCategory Category
        {
            get { return SPHealthCategory.Availability; }
        }

       public override SPHealthCheckErrorLevel ErrorLevel
        {
            get { return SPHealthCheckErrorLevel.Error; }
        }

        public override SPHealthAnalysisRuleAutomaticExecutionParameters AutomaticExecutionParameters
        {
            get
            {
                SPHealthAnalysisRuleAutomaticExecutionParameters retval =
                    new SPHealthAnalysisRuleAutomaticExecutionParameters();
                retval.Schedule = SPHealthCheckSchedule.Daily;
                retval.Scope = SPHealthCheckScope.All;
                retval.ServiceType = typeof(SPTimerService);
                return retval;
            }
        }
        
        public override SPHealthCheckStatus Check()
        {
            const long bytesInGb = 1024 * 1024 * 1024;

            if (!SPFarm.Joined)
                throw new InvalidOperationException();

            foreach (DriveInfo di in DriveInfo.GetDrives())
            {
                try
                {
                    if (!(di.IsReady && di.DriveType == DriveType.Fixed))
                        continue;

                    if (di.TotalFreeSpace < 10 * bytesInGb)
                        this.m_FailingDrives.Add(di);
                }
                catch (IOException)
                {
                }
            }

            if (this.m_FailingDrives.Count == 0)
                return SPHealthCheckStatus.Passed;
            else
                return SPHealthCheckStatus.Failed;
        } 
    }
}
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Text
Imports Microsoft.SharePoint.Administration
Imports Microsoft.SharePoint.Administration.Health

Public Class DiskDriveAlmostFull
    Inherits SPHealthAnalysisRule

    Private m_FailingDrives As List(Of DriveInfo) = New List(Of DriveInfo)

    Public Overrides ReadOnly Property Summary() As String
        Get
            Return "One or more disk drives are running out of free space."
        End Get
    End Property

    Public Overrides ReadOnly Property Explanation() As String
        Get
            Dim sb As StringBuilder = New StringBuilder()
            Dim drive As DriveInfo
            For Each drive In Me.m_FailingDrives
                sb.AppendFormat("{0} ({1}), ", _
                    drive.VolumeLabel, drive.Name)
            Next
            If sb.Length > 2 Then
                sb.Remove(sb.Length - 2, 2)
            End If

            Return String.Concat( _
            "The following drives on the failing servers have less than 10GB free: ", sb)

        End Get
    End Property

    Public Overrides ReadOnly Property Remedy() As String
        Get
            Return "Examine the failing servers and delete old logs or free space on the drives."
        End Get
    End Property

    Public Overrides ReadOnly Property Category() As Microsoft.SharePoint.Administration.Health.SPHealthCategory
        Get
            Return SPHealthCategory.Availability
        End Get
    End Property

    Public Overrides ReadOnly Property ErrorLevel() As Microsoft.SharePoint.Administration.Health.SPHealthCheckErrorLevel
        Get
            Return SPHealthCheckErrorLevel.Error
        End Get
    End Property

    Public Overrides ReadOnly Property AutomaticExecutionParameters() As Microsoft.SharePoint.Administration.Health.SPHealthAnalysisRuleAutomaticExecutionParameters
        Get
            Dim retval As SPHealthAnalysisRuleAutomaticExecutionParameters = _
                New SPHealthAnalysisRuleAutomaticExecutionParameters()
            retval.Schedule = SPHealthCheckSchedule.Daily
            retval.Scope = SPHealthCheckScope.All
            retval.ServiceType = Type.GetType("Microsoft.SharePoint.Administration.SPTimerService")
            Return retval
        End Get
    End Property

    Public Overrides Function Check() As Microsoft.SharePoint.Administration.Health.SPHealthCheckStatus

        Dim bytesInGb As Long = 1024 * 1024 * 1024

        If Not SPFarm.Joined Then
            Throw New InvalidOperationException()
        End If

        Dim di As DriveInfo
        For Each di In DriveInfo.GetDrives()
            Try
                If Not (di.IsReady And di.DriveType = DriveType.Fixed) Then
                    Continue For
                End If

                If di.TotalFreeSpace < 10 * bytesInGb Then
                    Me.m_FailingDrives.Add(di)
                End If
            Catch ex As IOException

            End Try
        Next

        If Me.m_FailingDrives.Count = 0 Then
            Return SPHealthCheckStatus.Passed
        Else
            Return SPHealthCheckStatus.Failed
        End If
    End Function

End Class

См. также

Задачи

Проверка правила работоспособности во время разработки

Практическое руководство. Создание компонента для регистрации правила работоспособности

Как: Развернуть правило работоспособности с пакетом решения