Cómo configurar una suscripción para usar la sincronización web (programación con RMO)
El procedimiento descrito en este tema es el tercer paso para configurar la sincronización web para la replicación de mezcla. Lleve a cabo este paso después de habilitar la publicación y configurar el equipo que ejecuta Microsoft Internet Information Services (IIS). 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). Al configurar una suscripción para utilizar la sincronización web para suscriptores que sólo puedan conectarse al publicador a través de HTTP, debe configurar correctamente la publicación. Para obtener más información, vea Cómo configurar una publicación para que permita la sincronización web (programación con RMO). Después de realizar los procedimientos de este tema, sincronice la suscripción que ha creado. Para obtener más información, vea Cómo sincronizar una suscripción de extracción (programación con RMO).
En este tema se describen los parámetros que requiere la sincronización web. Para obtener más información acerca de cómo crear una suscripción de extracción, vea Cómo crear una suscripción de extracción (programación con RMO).
Importante |
---|
La dirección URL del servidor web que se usa para la sincronización web (como https://servidor.dominio.com/ directorio replisapi.dll) especifica la ubicación de replisapi.dll. Si el servidor está configurado para usar un puerto diferente del puerto predeterminado 443 para la Capa de sockets seguros (SSL), también debe proporcionar el puerto: https://servidor.dominio.com:númeroDePuerto/directorio/replisapi.dll. El nombre del servidor en la dirección URL debe ser idéntico al que usó al crear el certificado SSL (Capa de sockets seguros) para IIS. Por ejemplo, en una intranet, es posible que pueda obtener acceso a un servidor web a través de https://servidor/. Sin embargo, si se usó el nombre completo (por ejemplo, https://servidor.dominio.com/) al crear el certificado, debe usarlo también en la dirección URL (https://servidor.dominio.com/directorio/replisapi.dll). |
Para configurar una suscripción para que use la sincronización web
Cree conexiones al suscriptor y al publicador con la clase ServerConnection.
Cree una instancia de la clase MergePublication con la conexión de publicador del paso 1.
(Opcional) Si la base de datos de suscripciones no existe, cree la base de datos con los objetos de administración de SQL Server (SMO) Database. Para obtener más información, vea Crear, modificar y eliminar bases de datos.
Cree una instancia de la clase MergePullSubscription.
Establezca las siguientes propiedades de la suscripción:
La conexión ServerConnection al suscriptor creada en el paso 1 para ConnectionContext.
El nombre de la base de datos de suscripciones para DatabaseName.
El nombre del publicador para PublisherName.
El nombre de la base de datos de publicación para PublicationDBName.
El nombre de la publicación para PublicationName.
El valor de true para UseWebSynchronization.
Ubicación del servidor web que hospeda la sincronización web para InternetUrl.
El inicio de sesión y la contraseña de la cuenta de Windows con la que se ejecuta el Agente de mezcla en el suscriptor para los campos Login y Password de SynchronizationAgentProcessSecurity, respectivamente. Se usa esta cuenta también cuando el Agente de mezcla establece conexiones al suscriptor local.
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.
Un valor de 0 para InternetSecurityMode y también valores para InternetLogin y InternetPassword cuando la autenticación básica HTTP se usa para tener acceso al servidor web. Recomendamos que use este método de autenticación para la sincronización web. Para obtener más información, vea Proteger la replicación por Internet.
Llame al método Create.
Mediante la instancia de MergePublication del paso 2, llame al método MakePullSubscriptionWellKnown para registrar la suscripción de extracción con el publicador.
Para configurar una suscripción que use la sincronización web para suscriptores que sólo puedan conectarse al publicador a través de un servidor web con HTTP
Cree una conexión al suscriptor mediante la clase ServerConnection.
(Opcional) Si la base de datos de suscripciones no existe, cree la base de datos con la clase SMO Database. Para obtener más información, vea Crear, modificar y eliminar bases de datos.
Cree una instancia de la clase MergePullSubscription.
Establezca las siguientes propiedades de la suscripción:
La conexión ServerConnection creada en el paso 1 para ConnectionContext.
El nombre de la base de datos de suscripciones para DatabaseName.
El nombre del publicador para PublisherName.
El nombre de la base de datos de publicación para PublicationDBName.
El nombre de la publicación para PublicationName.
Un valor de Anonymous para SubscriberType.
El valor de true para UseWebSynchronization.
Ubicación del servidor web que hospeda la sincronización web para InternetUrl.
El inicio de sesión y la contraseña de la cuenta de Windows con la que se ejecuta el Agente de mezcla en el suscriptor para los campos Login y Password de SynchronizationAgentProcessSecurity, respectivamente. Se usa esta cuenta también cuando el Agente de mezcla establece conexiones al suscriptor local.
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.
Un valor de 0 para InternetSecurityMode y también valores para InternetLogin y InternetPassword cuando la autenticación básica HTTP se usa para tener acceso a Web. Recomendamos que use este método de autenticación para la sincronización web. Para obtener más información, vea Proteger la replicación por Internet.
Llame al método Create.
Ejemplo
El ejemplo siguiente crea una suscripción que se sincroniza con el publicador mediante la sincronización web.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2008R2Replica";
string publicationDbName = "AdventureWorks2008R2";
string hostname = @"adventure-works\garrett1";
string webSyncUrl = "https://" + publisherInstance + "/WebSync/replisapi.dll";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions and Web synchronization.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
if ((publication.Attributes & PublicationAttributes.AllowWebSynchronization) == 0)
{
publication.Attributes |= PublicationAttributes.AllowWebSynchronization;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Enable Web synchronization.
subscription.UseWebSynchronization = true;
subscription.InternetUrl = webSyncUrl;
// Specify the same Windows credentials to use when connecting to the
// Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication;
subscription.InternetLogin = winLogin;
subscription.InternetPassword = winPassword;
// Ensure that we create a job for this subscription.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2008R2Replica"
Dim publicationDbName As String = "AdventureWorks2008R2"
Dim hostname As String = "adventure-works\garrett1"
Dim webSyncUrl As String = "https://" + publisherInstance + "/WebSync/replisapi.dll"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions and Web synchronization.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
If (publication.Attributes And PublicationAttributes.AllowWebSynchronization) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowWebSynchronization
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
subscription.CreateSyncAgentByDefault = True
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Enable Web synchronization.
subscription.UseWebSynchronization = True
subscription.InternetUrl = webSyncUrl
' Specify the same Windows credentials to use when connecting to the
' Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication
subscription.InternetLogin = winLogin
subscription.InternetPassword = winPassword
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
En este ejemplo, se crea una suscripción que se sincroniza con el publicador mediante la sincronización web para un suscriptor que sólo puede conectarse al publicador a través de un servidor web con HTTP.
// The publication must support anonymous Subscribers, pull
// subscriptions, and Web synchronization.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2008R2Replica";
string publicationDbName = "AdventureWorks2008R2";
string hostname = @"adventure-works\garrett1";
string webSyncUrl = "https://" + publisherInstance + "/WebSync/replisapi.dll";
//Create the Subscriber connection.
ServerConnection conn = new ServerConnection(subscriberName);
// Create the objects that we need.
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
conn.Connect();
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = conn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify an anonymous Subscriber type since we can't
// register at the Publisher with a direct connection.
subscription.SubscriberType = MergeSubscriberType.Anonymous;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Enable Web synchronization.
subscription.UseWebSynchronization = true;
subscription.InternetUrl = webSyncUrl;
// Specify the same Windows credentials to use when connecting to the
// Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication;
subscription.InternetLogin = winLogin;
subscription.InternetPassword = winPassword;
// Ensure that we create a job for this subscription.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
conn.Disconnect();
}
' The publication must support anonymous Subscribers, pull
' subscriptions, and Web synchronization.
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2008R2Replica"
Dim publicationDbName As String = "AdventureWorks2008R2"
Dim hostname As String = "adventure-works\\garrett1"
Dim webSyncUrl As String = "https://" + publisherInstance + "/WebSync/replisapi.dll"
'Create the Subscriber connection.
Dim conn As ServerConnection = New ServerConnection(subscriberName)
' Create the objects that we need.
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
conn.Connect()
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = conn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
' Specify an anonymous Subscriber type since we can't
' register at the Publisher with a direct connection.
subscription.SubscriberType = MergeSubscriberType.Anonymous
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Enable Web synchronization.
subscription.UseWebSynchronization = True
subscription.InternetUrl = webSyncUrl
' Specify the same Windows credentials to use when connecting to the
' Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication
subscription.InternetLogin = winLogin
subscription.InternetPassword = winPassword
' Ensure that we create a job for this subscription.
subscription.CreateSyncAgentByDefault = True
' Create the pull subscription at the Subscriber.
subscription.Create()
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
conn.Disconnect()
End Try