Como configurar uma assinatura para usar sincronização da Web (programação RMO)
O procedimento descrito neste tópico é a terceira etapa para se configurar sincronização da Web para replicação de mesclagem. Você deve executar esta etapa após habilitar a publicação e configurar o computador que está executando Microsoft IIS (Serviços de Informações da Internet). Para uma visão geral do processo de configuração, consulte Como configurar a sincronização da Web para replicação de mesclagem (Programação RMO). Ao configurar uma assinatura para usar sincronização da Web para Assinantes que podem se conectar ao Publicador somente através de HTTP, você deverá configurar adequadamente a Publicação. Para obter mais informações, consulte Como configurar uma publicação para permitir a sincronização da Web (Programação RMO). Depois que completar os procedimentos deste tópico, sincronize a assinatura que você criou. Para obter mais informações, consulte Como sincronizar uma assinatura pull (Programação RMO).
Este tópico descreve os parâmetros necessários à sincronização da Web. Para obter mais informações sobre como criar assinaturas pull, consulte Como criar uma assinatura pull (Programação RMO).
Importante |
---|
A URL do servidor da Web que é usada para sincronização da Web (tal como https://server.domain.com/directory/replisapi.dll) especifica o local de replisapi.dll. Se o servidor for configurado para usar uma porta que não seja a porta padrão 443 para protocolo SSL, você também precisará fornecer a porta: https://server.domain.com:PortNumber/directory/replisapi.dll. É necessário que o nome do servidor na URL seja o mesmo nome utilizado na criação do certificado. Por exemplo, em uma intranet, seria possível acessar um servidor da web por meio de https://server/. No entanto, se o nome totalmente qualificado (tal como https://server.domain.com/) foi usado na criação do certificado, será preciso usar esse nome totalmente qualificado na URL (https://server.domain.com/directory/replisapi.dll). |
Para configurar uma assinatura para usar sincronização da Web
Crie conexões com o Assinante e com o Publicador usando a classe ServerConnection.
Crie uma instância da classe MergePublication usando a conexão com o Publicador da etapa 1.
(Opcional) Se o banco de dados de assinatura não existir, crie o banco de dados usando a classe SMO Database. Para obter mais informações, consulte Criando, alterando e removendo bancos de dados.
Crie uma instância da classe MergePullSubscription.
Defina as seguintes propriedades de assinatura:
A ServerConnection para o Assinante criada na Etapa 1 para ConnectionContext.
Nome do banco de dados de assinatura para DatabaseName.
Nome do Publicador para PublisherName.
Nome do banco de dados de publicação para PublicationDBName.
Nome da publicação para PublicationName.
Valor de true para UseWebSynchronization.
Local do servidor da Web que hospeda a sincronização da Web para InternetUrl.
Logon e senha para a conta do Windows sob a qual o Merge Agent é executado no Assinante para os campos Login e Password de SynchronizationAgentProcessSecurity, respectivamente. Essa conta também é usada quando o Merge Agent faz conexões com o Assinante local.
Observação Quando a publicação é criada por um membro da função de servidor fixa sysadmin, você não precisa definir SnapshotGenerationAgentProcessSecurity. Para obter mais informações, consulte Modelo de segurança do agente de replicação.
Valor 0 para InternetSecurityMode e também valores para InternetLogin e InternetPassword quando é usada Autenticação Básica HTTP para acessar o servidor da Web. Recomendamos que você use este método de autenticação para sincronização da Web. Para obter mais informações, consulte Protegendo a replicação na Internet.
Chame o método Create.
Usando a instância de MergePublication da etapa 2, chame o método MakePullSubscriptionWellKnown para registrar a assinatura pull com o Publicador.
Para configurar uma assinatura para usar a sincronização da Web para Assinantes que podem se conectar ao Publicador somente através de um servidor da Web usando HTTP
Crie uma conexão com o Assinante usando a classe ServerConnection.
(Opcional) Se o banco de dados de assinatura não existir, crie o banco de dados usando a classe SMO Database. Para obter mais informações, consulte Criando, alterando e removendo bancos de dados.
Crie uma instância da classe MergePullSubscription.
Defina as seguintes propriedades de assinatura:
A ServerConnection criada na etapa 1 para ConnectionContext.
Nome do banco de dados de assinatura para DatabaseName.
Nome do Publicador para PublisherName.
Nome do banco de dados de publicação para PublicationDBName.
Nome da publicação para PublicationName.
Um valor de Anonymous para SubscriberType.
Valor de true para UseWebSynchronization.
Local do servidor da Web que hospeda a sincronização da Web para InternetUrl.
Logon e senha para a conta do Windows sob a qual o Merge Agent é executado no Assinante para os campos Login e Password de SynchronizationAgentProcessSecurity, respectivamente. Essa conta também é usada quando o Merge Agent faz conexões com o Assinante local.
Observação Quando a publicação é criada por um membro da função de servidor fixa sysadmin, você não precisa definir SnapshotGenerationAgentProcessSecurity. Para obter mais informações, consulte Modelo de segurança do agente de replicação.
Valor 0 para InternetSecurityMode e também valores para InternetLogin e InternetPassword quando é usada Autenticação Básica HTTP para acessar a Web. Recomendamos que você use este método de autenticação para sincronização da Web. Para obter mais informações, consulte Protegendo a replicação na Internet.
Chame o método Create.
Exemplo
O exemplo a seguir cria uma assinatura sincronizada com o Publicador usando sincronização da 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
Esse exemplo cria uma assinatura sincronizada com o Publicador usando sincronização da Web para um Assinante que pode se conectar ao Publicador somente através de um servidor da Web usando 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