Cómo configurar una publicación para que permita la sincronización web (programación con RMO)
El procedimiento descrito en este tema es el primer paso para configurar la sincronización web para la replicación de mezcla. Para obtener información general acerca del proceso de configuración, vea Cómo configurar la sincronización web para la replicación de mezcla (programación con RMO). Una vez terminados lis procedimiento de este tema, siga con el segundo paso: configurar el servidor IIS. El segundo paso se describe en Cómo configurar IIS para la sincronización Web.
En este tema se describen los parámetros que requieren la sincronización web. Para obtener más información acerca de cómo crear publicaciones, vea Cómo crear una publicación (programación con RMO).
Para configurar una publicación de mezcla para que permita la sincronización web
Cree una conexión al Publicador mediante la clase ServerConnection.
Cree una instancia de la clase ReplicationDatabase para la base de datos de publicación.
Establezca la propiedad ConnectionContext en la instancia de ServerConnection del paso 1.
Llame al método LoadProperties. Si este método devuelve false, compruebe que la base de datos existe.
Si la propiedad es EnabledMergePublishingfalse, establezca esta propiedad en true y, a continuación, llame a CommitPropertyChanges.
Cree una instancia de la clase MergePublication y, a continuación, establezca las propiedades siguientes para este objeto:
La ServerConnection del paso 1 para ConnectionContext.
El nombre de la base de datos publicada para DatabaseName.
Un nombre de publicación para Name.
Agregue los valores AllowWebSynchronization y AllowPull a Attributes usando el operador lógico OR inclusivo (| en Visual C# y Or en Visual Basic) para habilitar la sincronización web.
(Opcional) Si los Suscriptores sólo se van a conectar al Publicador a través de HTTP, agregue el valor AllowAnonymous a Attributes usando el operador lógico OR inclusivo (| en Visual C# y Or en Visual Basic).
Para una nueva publicación, para proporcionar las credenciales para la cuenta de Windows con la que se ejecuta el Agente de instantáneas, establezca los campos Login y Password de SnapshotGenerationAgentProcessSecurity. También se usa esta cuenta cuando el Agente de instantáneas realiza conexiones al Distribuidor local y para cualquier conexión remota cuando se usa Autenticación de Windows.
[!NOTA]
Cuando un miembro de la función fija de servidor sysadmin crea la publicación, no es necesario establecer SnapshotGenerationAgentProcessSecurity. Para obtener más información, vea Modelo de seguridad del Agente de replicación.
Llame a uno de los métodos siguientes:
Para una publicación nueva, para crear la publicación con sincronización web habilitada, llame a Create.
Para una publicación existente, para habilitar la sincronización web, llame a CommitPropertyChanges.
Ejemplo
El ejemplo siguiente crea una publicación que está habilitada para la sincronización web.
// Set the Publisher, publication database, and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks";
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 = "AdventureWorks"
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