Procédure : configurer une publication qui autorise la synchronisation Web (programmation RMO)

La procédure de cette rubrique constitue la première étape de la configuration de la synchronisation Web pour la réplication de fusion. Pour obtenir une vue d'ensemble du processus de configuration, consultez Procédure : configurer la synchronisation Web pour la réplication de fusion (programmation RMO). Après avoir terminé les procédures de cette rubrique, poursuivez par la deuxième étape, qui est la configuration du serveur IIS. Cette deuxième étape est décrite dans Procédure : configurer IIS pour la synchronisation Web.

Cette rubrique décrit les paramètres qui sont requis par la synchronisation Web. Pour plus d'informations sur la création de publications, consultez Procédure : créer une publication (programmation RMO).

Pour configurer une publication de fusion qui autorise la synchronisation Web

  1. Créez une connexion au serveur de publication en utilisant la classe ServerConnection.

  2. Créez une instance de la classe ReplicationDatabase pour la base de données de publication.

  3. Affectez à la propriété ConnectionContext l'instance de ServerConnection créée à l'étape 1.

  4. Appelez la méthode LoadProperties. Si cette méthode retourne false, vérifiez que la base de données existe.

  5. Si la propriété EnabledMergePublishing a la valeur false, affectez-lui la valeur true, puis appelez CommitPropertyChanges.

  6. Créez une instance de la classe MergePublication, puis définissez les propriétés suivantes pour cet objet :

    • La classe ServerConnection créée à l'étape 1 pour la propriété ConnectionContext.

    • Le nom de la base de données publiée pour DatabaseName.

    • Le nom de la publication pour Name.

    • Ajoutez les valeurs AllowWebSynchronization et AllowPull à Attributes en utilisant l'opérateur OR logique inclusif (| en Visual C# et Or en Visual Basic) pour activer la synchronisation Web.

    • (Facultatif) Si les Abonnés se connectent au serveur de publication uniquement par le biais du protocole HTTP, ajoutez la valeur AllowAnonymous à Attributes en utilisant l'opérateur OR logique inclusif (| en Visual C# et Or en Visual Basic).

    • Dans le cas d'une nouvelle publication, pour fournir les informations d'identification pour le compte Windows sous lequel l'Agent de capture instantanée s'exécute sur l'Abonné, définissez les champs Login et Password de SnapshotGenerationAgentProcessSecurity. Ce compte est également utilisé lorsque l'Agent de capture instantanée établit des connexions au serveur de distribution local et pour toute connexion distante lors de l'utilisation de l'authentification Windows.

      Notes

      Lorsque la publication est créée par un membre du rôle serveur fixe sysadmin, vous n'avez pas besoin de définir SnapshotGenerationAgentProcessSecurity. Pour plus d'informations, consultez Modèle de sécurité de l'Agent de réplication.

  7. Appelez l'une des méthodes suivantes :

    • Dans le cas d'une nouvelle publication, pour créer la publication avec activation de la synchronisation Web, appelez Create.

    • Pour une publication existante, pour activer la synchronisation Web, appelez CommitPropertyChanges.

Exemple

L'exemple suivant crée une publication qui est activée pour la synchronisation Web.

            // 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