Как настроить публикацию для использования веб-синхронизации (программирование объектов RMO)

Процедура, приведенная в этом разделе, является первым шагом в настройке веб-синхронизации для репликации слиянием. Обзор этого процесса настройки см. в разделе Как настроить веб-синхронизацию для репликации слиянием (программирование объектов RMO). После завершения процедур, приведенных в этом разделе, перейдите ко второму шагу и настройте сервер IIS. Этот шаг описан в разделе Как настроить сервер IIS для веб-синхронизации.

В этом разделе описываются параметры, необходимые для веб-синхронизации. Дополнительные сведения о создании публикации см. в разделе Как создать публикацию (программирование объектов RMO).

Настройка публикации слиянием для включения веб-синхронизации

  1. Создайте соединение с издателем с помощью класса ServerConnection.

  2. Создайте экземпляр класса ReplicationDatabase для базы данных публикации.

  3. В качестве значения для свойства ConnectionContext укажите экземпляр соединения ServerConnection, созданный на шаге 1.

  4. Вызовите метод LoadProperties. Если этот метод возвращает значение false, проверьте, существует ли база данных.

  5. Если свойство EnabledMergePublishing имеет значение false, присвойте ему значение true и вызовите метод CommitPropertyChanges.

  6. Создайте экземпляр класса MergePublication и задайте следующие свойства для этого объекта:

    • Соединение ServerConnection, созданное на шаге 1, в качестве значения свойства ConnectionContext.

    • Имя опубликованной базы данных в свойстве DatabaseName;

    • Имя публикации в качестве значения свойства Name.

    • Чтобы включить веб-синхронизацию, добавьте значения AllowWebSynchronization и AllowPull к Attributes с помощью исключающего логического оператора OR (| в Visual C# и Or в Visual Basic).

    • Если подписчики соединяются с издателем только по протоколу HTTP, добавьте значение AllowAnonymous к Attributes с помощью исключающего логического оператора OR (| в Visual C# and Or в Visual Basic) (необязательно).

    • Чтобы предоставить учетные данные для учетной записи Windows, с которой выполняется агент моментальных снимков, установите поля Login и Password для SnapshotGenerationAgentProcessSecurity. Эта учетная запись также используется, если агент моментальных снимков устанавливает соединение с распространителем, или для любых других удаленных соединений, для которых используется проверка подлинности Windows.

      ПримечаниеПримечание

      Если публикация создается членом предопределенной роли сервера sysadmin, свойство SnapshotGenerationAgentProcessSecurity устанавливать не требуется. Дополнительные сведения см. в разделе Модель безопасности агента репликации.

  7. Вызовите один из следующих методов:

    • Для новой публикации с включенной веб-синхронизацией вызовите метод Create.

    • Для существующей публикации, чтобы включить веб-синхронизацию, вызовите метод CommitPropertyChanges.

Пример

В следующем примере создается публикация, в которой разрешена веб-синхронизация.

            // Set the Publisher, publication database, and publication names.
            string publisherName = publisherInstance;
            string publicationName = "AdvWorksSalesOrdersMerge";
            string publicationDbName = "AdventureWorks2008R2";

            ReplicationDatabase publicationDb;
            MergePublication publication;

            // Create a connection to the Publisher.
            ServerConnection conn = new ServerConnection(publisherName);

            try
            {
                // Connect to the Publisher.
                conn.Connect();

                // Enable the database for merge publication.               
                publicationDb = new ReplicationDatabase(publicationDbName, conn);
                if (publicationDb.LoadProperties())
                {
                    if (!publicationDb.EnabledMergePublishing)
                    {
                        publicationDb.EnabledMergePublishing = true;
                    }
                }
                else
                {
                    // Do something here if the database does not exist. 
                    throw new ApplicationException(String.Format(
                        "The {0} database does not exist on {1}.",
                        publicationDb, publisherName));
                }

                // Set the required properties for the merge publication.
                publication = new MergePublication();
                publication.ConnectionContext = conn;
                publication.Name = publicationName;
                publication.DatabaseName = publicationDbName;

                // Enable Web synchronization, if not already enabled.
                if ((publication.Attributes & PublicationAttributes.AllowWebSynchronization) == 0)
                {
                    publication.Attributes |= PublicationAttributes.AllowWebSynchronization;
                }

                // Enable pull subscriptions, if not already enabled.
                if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
                {
                    publication.Attributes |= PublicationAttributes.AllowPull;
                }
                
                // Enable Subscriber requested snapshot generation. 
                publication.Attributes |= PublicationAttributes.AllowSubscriberInitiatedSnapshot;

                // Enable anonymous access for Subscribers that cannot make a direct connetion 
                // to the Publisher. 
                publication.Attributes |= PublicationAttributes.AllowAnonymous;

                // Specify the Windows account under which the Snapshot Agent job runs.
                // This account will be used for the local connection to the 
                // Distributor and all agent connections that use Windows Authentication.
                publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
                publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;

                // Explicitly set the security mode for the Publisher connection
                // Windows Authentication (the default).
                publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;

                if (!publication.IsExistingObject)
                {
                    // Create the merge publication and the Snapshot Agent job.
                    publication.Create();
                    publication.CreateSnapshotAgent();
                }
                else
                {
                    throw new ApplicationException(String.Format(
                        "The {0} publication already exists.", publicationName));
                }
            }

            catch (Exception ex)
            {
                // Implement custom application error handling here.
                throw new ApplicationException(String.Format(
                    "The publication {0} could not be created.", publicationName), ex);
            }
            finally
            {
                conn.Disconnect();
            }
' Set the Publisher, publication database, and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2008R2"

Dim publicationDb As ReplicationDatabase
Dim publication As MergePublication

' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Enable the database for merge publication.                
    publicationDb = New ReplicationDatabase(publicationDbName, conn)
    If publicationDb.LoadProperties() Then
        If Not publicationDb.EnabledMergePublishing Then
            publicationDb.EnabledMergePublishing = True
        End If
    Else
        ' Do something here if the database does not exist. 
        Throw New ApplicationException(String.Format( _
         "The {0} database does not exist on {1}.", _
         publicationDb, publisherName))
    End If

    ' Set the required properties for the merge publication.
    publication = New MergePublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    ' Enable Web synchronization, if not already enabled.
    If (publication.Attributes And PublicationAttributes.AllowWebSynchronization) = 0 Then
        publication.Attributes = publication.Attributes _
        Or PublicationAttributes.AllowWebSynchronization
    End If

    ' Enable pull subscriptions, if not already enabled.
    If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
        publication.Attributes = publication.Attributes _
        Or PublicationAttributes.AllowPull
    End If

    ' Enable Subscriber requested snapshot generation. 
    publication.Attributes = publication.Attributes _
        Or PublicationAttributes.AllowSubscriberInitiatedSnapshot

    ' Enable anonymous access for Subscribers that cannot 
    ' make a direct connetion to the Publisher. 
    publication.Attributes = publication.Attributes _
        Or PublicationAttributes.AllowAnonymous

    ' Specify the Windows account under which the Snapshot Agent job runs.
    ' This account will be used for the local connection to the 
    ' Distributor and all agent connections that use Windows Authentication.
    publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
    publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword

    ' Explicitly set the security mode for the Publisher connection
    ' Windows Authentication (the default).
    publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True

    If Not publication.IsExistingObject Then
        ' Create the merge publication and the Snapshot Agent job.
        publication.Create()
        publication.CreateSnapshotAgent()
    Else
        Throw New ApplicationException(String.Format( _
            "The {0} publication already exists.", publicationName))
    End If
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
        "The publication {0} could not be created.", publicationName), ex)
Finally
    conn.Disconnect()
End Try