Web 同期を使用するようにサブスクリプションを構成する方法 (RMO プログラミング)
ここでは、マージ レプリケーション用に Web 同期を構成する 3 つ目の手順を示します。この手順は、パブリケーションを有効にし、Microsoft インターネット インフォメーション サービス (IIS) を実行しているコンピュータを構成した後に実行します。構成プロセスの概要については、「マージ レプリケーションの Web 同期を構成する方法 (RMO プログラミング)」を参照してください。HTTP を通じてのみパブリッシャに接続できるサブスクライバに対して Web 同期を使用するようにサブスクリプションを構成する場合は、パブリケーションを正しく構成する必要があります。詳細については、「Web 同期を許可するようにパブリケーションを構成する方法 (RMO プログラミング)」を参照してください。このトピックの手順を完了したら、作成したサブスクリプションを同期します。詳細については、「プル サブスクリプションを同期する方法 (RMO プログラミング)」を参照してください。
ここでは、Web 同期に必要なパラメータについて説明します。プル サブスクリプション作成の詳細については、「プル サブスクリプションを作成する方法 (RMO プログラミング)」を参照してください。
重要 |
---|
Web 同期に使用される Web サーバーの URL (https://server.domain.com/directory/replisapi.dll など) は、replisapi.dll の場所を指定します。サーバーが SSL (Secure Socket Layer) の既定のポート 443 以外のポートを使用するように構成されている場合は、ポート https://server.domain.com:PortNumber/directory/replisapi.dll も指定する必要があります。URL のサーバーの名前は、証明書が作成されたときに使用された名前と同じにする必要があります。たとえばイントラネットで、https://server/ で Web サーバーにアクセスできるとします。しかし、証明書を作成したときに完全修飾名 (https://server.domain.com/ など) を使用していた場合、URL にもこの完全修飾名を使用する必要があります (https://server.domain.com/directory/replisapi.dll)。 |
Web 同期を使用するようにサブスクリプションを構成するには
ServerConnection クラスを使用して、サブスクライバおよびパブリッシャへの接続を作成します。
手順 1. のパブリッシャ接続を使用して、MergePublication クラスのインスタンスを作成します。
(省略可) サブスクリプション データベースが存在しない場合は、SQL Server 管理オブジェクト (SMO) の Database クラスを使用してデータベースを作成します。詳細については、「データベースの作成、変更、および削除」を参照してください。
MergePullSubscription クラスのインスタンスを作成します。
次のサブスクリプション プロパティを設定します。
手順 1. で作成した、サブスクライバに対する ServerConnection を ConnectionContext に指定します。
サブスクリプション データベース名を DatabaseName に指定します。
パブリッシャ名を PublisherName に指定します。
パブリケーション データベース名を PublicationDBName に指定します。
パブリケーション名を PublicationName に指定します。
UseWebSynchronization には true を指定します。
Web 同期をホストする Web サーバーの場所を InternetUrl に指定します。
サブスクライバでマージ エージェントを実行するときに使用される Windows アカウントのログインとパスワードを、SynchronizationAgentProcessSecurity の Login フィールドおよび Password フィールドにそれぞれ指定します。このアカウントは、マージ エージェントがローカル サブスクライバに接続するときにも使用されます。
注意 パブリケーションが sysadmin 固定サーバー ロールのメンバで作成されている場合は、SnapshotGenerationAgentProcessSecurity を設定する必要はありません。詳細については、「レプリケーション エージェントのセキュリティ モデル」を参照してください。
HTTP 基本認証を使用して Web サーバーにアクセスする場合は、InternetSecurityMode に値 0 を指定し、InternetLogin および InternetPassword にも値を指定します。Web 同期の場合はこの認証方法を使用することをお勧めします。詳細については、「インターネット経由のレプリケーションのセキュリティ」を参照してください。
Create メソッドを呼び出します。
手順 2. の MergePublication インスタンスを使用して、MakePullSubscriptionWellKnown メソッドを呼び出し、パブリッシャにプル サブスクリプションを登録します。
HTTP を使用して Web サーバー経由でのみパブリッシャに接続できるサブスクライバに対して Web 同期を使用するようにサブスクリプションを構成するには
ServerConnection クラスを使用して、サブスクライバへの接続を作成します。
(省略可) サブスクリプション データベースが存在しない場合は、SMO Database クラスを使用してデータベースを作成します。詳細については、「データベースの作成、変更、および削除」を参照してください。
MergePullSubscription クラスのインスタンスを作成します。
次のサブスクリプション プロパティを設定します。
ConnectionContext に、手順 1. で作成した ServerConnection を設定します。
サブスクリプション データベース名を DatabaseName に指定します。
パブリッシャ名を PublisherName に指定します。
パブリケーション データベース名を PublicationDBName に指定します。
パブリケーション名を PublicationName に指定します。
SubscriberType には Anonymous の値を指定します。
UseWebSynchronization には true を指定します。
Web 同期をホストする Web サーバーの場所を InternetUrl に指定します。
サブスクライバでマージ エージェントを実行するときに使用される Windows アカウントのログインとパスワードを、SynchronizationAgentProcessSecurity の Login フィールドおよび Password フィールドにそれぞれ指定します。このアカウントは、マージ エージェントがローカル サブスクライバに接続するときにも使用されます。
注意 パブリケーションが sysadmin 固定サーバー ロールのメンバで作成されている場合は、SnapshotGenerationAgentProcessSecurity を設定する必要はありません。詳細については、「レプリケーション エージェントのセキュリティ モデル」を参照してください。
HTTP 基本認証を使用して Web にアクセスする場合は、InternetSecurityMode に値 0 指定し、InternetLogin および InternetPassword にも値を指定します。Web 同期の場合はこの認証方法を使用することをお勧めします。詳細については、「インターネット経由のレプリケーションのセキュリティ」を参照してください。
Create メソッドを呼び出します。
使用例
次の例では、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
この例では、HTTP を使用して Web サーバー経由でのみパブリッシャに接続できるサブスクライバに対して Web 同期を使用して、パブリッシャと同期されるサブスクリプションを作成します。
// 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