Procedura: Configurazione di una sottoscrizione per l'utilizzo della sincronizzazione tramite il Web (programmazione RMO)
La procedura descritta in questo argomento rappresenta il terzo passaggio nella configurazione della sincronizzazione tramite il Web per la replica di tipo merge. Questo passaggio è successivo all'attivazione della pubblicazione e alla configurazione del computer che esegue Microsoft Internet Information Services (IIS). Per una panoramica del processo di configurazione, vedere Procedura: Configurazione della sincronizzazione tramite il Web per la replica di tipo merge (programmazione RMO). Quando si configura una sottoscrizione per l'utilizzo della sincronizzazione tramite il Web per Sottoscrittori che possono connettersi al server di pubblicazione solo tramite HTTP, è necessario configurare correttamente la pubblicazione. Per ulteriori informazioni, vedere Procedura: Configurazione di una pubblicazione per consentire la sincronizzazione tramite il Web (programmazione RMO). Al termine delle procedure descritte in questo argomento, sincronizzare la sottoscrizione creata. Per ulteriori informazioni, vedere Procedura: Sincronizzazione di una sottoscrizione pull (programmazione RMO).
In questo argomento sono descritti i parametri richiesti per la sincronizzazione tramite il Web. Per ulteriori informazioni sulla creazione di sottoscrizioni pull, vedere Procedura: Creazione di una sottoscrizione pull (programmazione RMO).
Importante |
---|
L'URL del server Web utilizzato per la sincronizzazione tramite il Web, ad esempio https://server.domain.com/directory/replisapi.dll, specifica il percorso del file replisapi.dll. Se il server è configurato per l'utilizzo di una porta non predefinita per SSL (Secure Sockets Layer), ovvero non la porta 443, è necessario specificare anche la porta: https://server.domain.com:NumeroPorta/directory/replisapi.dll. Il nome del server nell'URL deve essere identico a quello utilizzato durante la creazione del certificato SSL. In una rete Intranet, ad esempio, può essere possibile accedere a un server Web tramite https://server/. Se tuttavia viene utilizzato il nome completo, ad esempio https://server.domain.com/, al momento della creazione del certificato, è necessario utilizzare tale nome nell'URL: https://server.domain.com/directory/replisapi.dll. |
Per configurare una sottoscrizione per l'utilizzo della sincronizzazione tramite il Web
Creare una connessione sia al Sottoscrittore che al server di pubblicazione tramite la classe ServerConnection.
Creare un'istanza della classe MergePublication utilizzando la connessione al server di pubblicazione creata nel passaggio 1.
(Facoltativo) Se il database di sottoscrizione non esiste, crearlo utilizzando la classe SMO (SQL Server Management Objects) Database. Per ulteriori informazioni, vedere Creazione, modifica e rimozione di database.
Creare un'istanza della classe MergePullSubscription.
Impostare le proprietà seguenti per la sottoscrizione:
Connessione ServerConnection al Sottoscrittore creata nel passaggio 1 per ConnectionContext.
Nome del database di sottoscrizione per DatabaseName.
Nome del server di pubblicazione per PublisherName.
Nome del database di pubblicazione per PublicationDBName.
Nome della pubblicazione per PublicationName.
Valore true per UseWebSynchronization.
Percorso del server Web che ospita la sincronizzazione tramite il Web per InternetUrl.
Nome di accesso e password per l'account di Windows utilizzato per eseguire l'agente di merge nel Sottoscrittore, rispettivamente per i campi Login e Password di SynchronizationAgentProcessSecurity. Questo account viene utilizzato anche per le connessioni dell'agente di merge al Sottoscrittore locale.
[!NOTA]
Quando la pubblicazione viene creata da un membro del ruolo predefinito del server sysadmin, non è necessario impostare SnapshotGenerationAgentProcessSecurity. Per ulteriori informazioni, vedere Modello di protezione dell'agente di replica.
Valore 0 per InternetSecurityMode e inoltre valori per InternetLogin e InternetPassword quando per l'accesso al server Web viene utilizzata l'autenticazione di base HTTP. Si consiglia di utilizzare questo metodo di autenticazione per la sincronizzazione tramite il Web. Per ulteriori informazioni, vedere Protezione della replica su Internet.
Chiamare il metodo Create.
Utilizzando l'istanza della classe MergePublication creata nel passaggio 2, chiamare il metodo MakePullSubscriptionWellKnown per registrare la sottoscrizione pull nel server di pubblicazione.
Per configurare una sottoscrizione per l'utilizzo della sincronizzazione tramite il Web per Sottoscrittori che possono connettersi al server di pubblicazione solo tramite un server Web utilizzando HTTP
Creare una connessione al Sottoscrittore tramite la classe ServerConnection.
(Facoltativo) Se il database di sottoscrizione non esiste, crearlo utilizzando la classe SMO Database. Per ulteriori informazioni, vedere Creazione, modifica e rimozione di database.
Creare un'istanza della classe MergePullSubscription.
Impostare le proprietà seguenti per la sottoscrizione:
Oggetto ServerConnection creato nel passaggio 1 per ConnectionContext.
Nome del database di sottoscrizione per DatabaseName.
Nome del server di pubblicazione per PublisherName.
Nome del database di pubblicazione per PublicationDBName.
Nome della pubblicazione per PublicationName.
Valore Anonymous per SubscriberType.
Valore true per UseWebSynchronization.
Percorso del server Web che ospita la sincronizzazione tramite il Web per InternetUrl.
Nome di accesso e password per l'account di Windows utilizzato per eseguire l'agente di merge nel Sottoscrittore, rispettivamente per i campi Login e Password di SynchronizationAgentProcessSecurity. Questo account viene utilizzato anche per le connessioni dell'agente di merge al Sottoscrittore locale.
[!NOTA]
Quando la pubblicazione viene creata da un membro del ruolo predefinito del server sysadmin, non è necessario impostare SnapshotGenerationAgentProcessSecurity. Per ulteriori informazioni, vedere Modello di protezione dell'agente di replica.
Valore 0 per InternetSecurityMode e inoltre valori per InternetLogin e InternetPassword quando per l'accesso al server Web viene utilizzata l'autenticazione di base HTTP. Si consiglia di utilizzare questo metodo di autenticazione per la sincronizzazione tramite il Web. Per ulteriori informazioni, vedere Protezione della replica su Internet.
Chiamare il metodo Create.
Esempio
Nell'esempio seguente viene creata una sottoscrizione sincronizzata con il server di pubblicazione mediante la sincronizzazione tramite il Web.
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
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 = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
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
In questo esempio viene creata una sottoscrizione sincronizzata con il server di pubblicazione mediante la sincronizzazione tramite il Web per un Sottoscrittore che può connettersi al server di pubblicazione solo tramite un server Web utilizzando 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 = "AdventureWorksReplica";
string publicationDbName = "AdventureWorks";
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 = "AdventureWorksReplica"
Dim publicationDbName As String = "AdventureWorks"
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