Поделиться через


Как выполнить развертывание платформы Sync Framework в Windows Azure

В этом разделе показано, как развертывать компоненты платформы Sync Framework в службе, размещенной в Windows Azure. Здесь также содержатся рекомендации по созданию многоуровневого приложения, которое синхронизирует данные из базы данных SQL Azure с базой данных SQL Server на другом компьютере.

Основные сведения о синхронизации SQL Azure

Сохранение данных в базе данных База данных SQL Azure дает многочисленные преимущества, такие как безопасный доступ к данным с любого компьютера с доступом к Интернету. Однако иногда приходится использовать сеть, которая работает медленно или является ненадежной. Если с помощью платформы Sync Framework синхронизировать данные между базой данных SQL Azure и базой данных SQL Server на локальном компьютере, можно работать с данными на локальном компьютере, а не с данными в Интернете. Это позволяет снизить сетевой трафик, повысить надежность доступа к данным даже во время работы без сетевого подключения и вместе с тем поддерживать актуальное состояние локальной базы данных по отношению к базе данных SQL Azure.

Обычно приложение, синхронизирующее базу данных SQL Server с базой данных SQL Azure, структурируется с использованием двухуровневой или многоуровневой архитектуры.

  • Двухуровневая архитектура. Sync Framework запускается на локальном компьютере и использует объект SqlSyncProvider для подключения к базе данных SQL Azure аналогично соединению с любой другой базой данных SQL Server. Дополнительные сведения о выполнении этого действия см. в документации по среде Как настроить и выполнить синхронизацию с SQL Azure.

  • Многоуровневая архитектура. Поставщик базы данных платформы Sync Framework запускается в службе, размещенной в Windows Azure, и взаимодействует с поставщиком прокси-сервера, запущенном на локальном компьютере. Приложение синхронизации запускается на локальном компьютере и соединяет поставщик базы данных, представляющий локальную базу данных, с поставщиком прокси-сервера, который взаимодействует со службой Windows Azure. Служба Windows Azure состоит главным образом из поставщика базы данных SqlSyncProvider, который функционирует в рамках веб-роли или рабочей роли Windows Azure и представляет конкретную базу данных SQL Azure.

Дополнительные сведения об архитектуре синхронизации см. в разделе Архитектура и классы для синхронизации базы данных.

Подготовка к синхронизации данных SQL Azure

Прежде чем появится возможность проводить синхронизацию с помощью базы данных SQL Azure, необходимо выполнить несколько шагов.

  1. Провести провизионирование базы данных SQL Azure для синхронизации. При этом происходит создание в базе данных таблиц отслеживания и хранимых процедур, необходимых для синхронизации. Это административная задача, поэтому не следует ее включать в службу Windows Azure. Вместо этого можно провизионировать базу данных путем соединения с базой данных SQL Azure со своего компьютера с использованием методов провизионирования платформы Sync Framework. Пример провизионирования базы данных SQL Azure см. в разделе Как настроить и выполнить синхронизацию с SQL Azure.

  2. Определите интерфейс службы Windows Azure. Создайте компонент, который реализует этот интерфейс, работает в веб-роли Windows Azure и вызывает объект SqlSyncProvider для выполнения задач синхронизации. Создайте поставщиком прокси-сервера, который запускается на локальном компьютере и взаимодействует со службой Windows Azure.

  3. Разверните приложение службы, включая компоненты платформы Sync Framework, в службе, размещенной в Windows Azure.

  4. Соедините поставщик локальной базы данных с поставщиком прокси-сервера и проведите синхронизацию.

Определение и реализация интерфейса службы и поставщика прокси-сервера

В многоуровневой архитектуре служба, размещенная в Windows Azure, представляет собой средний уровень, который осуществляет взаимодействие между поставщиком прокси-сервера на локальном компьютере и базой данных SQL Azure. Способ взаимодействия поставщика-посредника с приложением службы определяется пользователем, как и реализация поставщика прокси-сервера и реализация компонента приложения службы, вызывающего поставщик базы данных SqlSyncProvider в службе, размещенной в Windows Azure. Эти компоненты имеют следующий типичный проект:

  1. Определите интерфейс контракта службы Windows Communication Foundation (WCF), который включает все необходимые методы для синхронизации, такие как GetChangeBatch и ProcessChangeBatch.

  2. Создайте компонент, который реализует эти методы контракта службы и вызывает объект SqlSyncProvider для выполнения операций с базой данных SQL Azure.

  3. Разверните этот компонент и требуемые компоненты платформы Sync Framework для веб-роли в службе, размещенной в Windows Azure. Можно также создать рабочую роль, выполняющую определенные задачи обработки для приложения и взаимодействующую напрямую с компонентами в веб-роли. Теперь выполните развертывание этих компонентов.

  4. Создайте прокси-поставщика, который реализует класс KnowledgeSyncProvider, запускается на локальном компьютере и выполняет вызовы к интерфейсу службы, реализованному службой, размещенной в Windows Azure.

Реализация интерфейса службы и прокси-поставщика может оказаться довольно сложной. Пример приложения синхронизации, в котором используется WCF для взаимодействия со службой, размещенной в Windows Azure, и проводится синхронизация с базой данных SQL Azure, см. в разделе Code Gallery.

Развертывание компонентов платформы Sync Framework в Windows Azure

Приложение службы, размещенной в Windows Azure, использует компоненты платформы Sync Framework в качестве закрытых сборок. Это гарантирует использование в служебном приложении только требуемого набора компонентов платформы Sync Framework, а также исключает отрицательное воздействие на приложение службы компонентов платформы Sync Framework, которые используются другими приложениями. После настройки приложения на использование личных сборок платформы Sync Framework разверните служебное приложение таким же образом, как осуществляется развертывание любой службы, размещенной в Windows Azure.

Примечание по безопасностиПримечание по безопасности

Закрытые сборки не получают автоматически обновления безопасности, поэтому устанавливать все необходимые обновления компонентов платформы Sync Framework должен владелец службы.

Чтобы настроить служебное приложение на использование компонентов платформы Sync Framework в качестве личных сборок, выполните следующие шаги.

  1. Установите пакет SDK платформы Sync Framework 2.1 на локальном компьютере. Пакет SDK можно найти по следующему адресу: Центр разработки MSDN Sync Framework. Папкой установки по умолчанию для сборок платформы Sync Framework 2.1 на базе x64 является «C:\Program Files\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\x64».

  2. Скопируйте управляемые сборки платформы Sync Framework, используемые приложением, в папку, которая содержит сборки служебного приложения. Сборки платформы Sync Framework не находятся в глобальном кэше сборок на сервере Windows Azure, поэтому платформа .NET Framework ищет их в папке, где находится сборка приложения. Для синхронизации данных используются следующие управляемые сборки:

    • Microsoft.Synchronization.dll

    • Microsoft.Synchronization.Data.dll

    • Microsoft.Synchronization.Data.SqlServer.dll

  3. Создайте папку с именем «synchronization.assemblies» в корневом каталоге служебного приложения. Скопируйте неуправляемые сборки, требуемые для приложения, из папки установки платформы Sync Framework в папку synchronization.assemblies. Для синхронизации базы данных используется следующая неуправляемая сборка:

    • Synchronization21.dll
  4. Платформа Sync Framework использует для вызова неуправляемых сборок технологию COM. В технологии COM для поиска сборок обычно используется реестр. Работая в среде Windows Azure, вместо использования реестра включите два файла манифеста, чтобы помочь модели COM находить личные неуправляемые сборки.

    Создайте первый файл манифеста путем создания текстового файла с именем «synchronization.assemblies.manifest» в папке synchronization.assemblies. Скопируйте в этот файл следующие данные:

    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
    
    <assemblyIdentity
       type="x64"
       name="synchronization.assemblies"
       version="2.1.0.0"
    />
    
      <file name = "synchronization21.dll">
        <comClass clsid="{EC413D66-6221-4ebb-AC55-4900FB321011}" threadingModel="Both"/>    
      </file>
    
    </assembly>
    

    Создайте еще один файл манифеста путем создания текстового файла с именем «webapp.manifest» в корневой папке приложения. Скопируйте в этот файл следующие данные:

    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    
      <assemblyIdentity name="webapp" version="8.0.0.0" type="x64"/>
    
      <dependency>
        <dependentAssembly>
    
          <assemblyIdentity name="synchronization.assemblies" version="2.1.0.0" type="x64"/>
        </dependentAssembly>
      </dependency>
    
    
    </assembly>
    

    Дополнительные сведения о личных сборках COM см. в разделе Изолированные приложения и параллельные сборки.

  5. Создайте в приложении контекст активации, используемый для загрузки сборок COM во время выполнения. Для этого создайте в проекте класс, подобный следующему, и вызовите при запуске приложения метод CreateActivationContext, например, путем переопределения метода Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Runtime.InteropServices;
    using System.IO;
    
    namespace Microsoft.Samples.Synchronization
    {
        public class ActivationContext
        {
            // Activation Context API Functions 
    
            [DllImport("Kernel32.dll", SetLastError = true)]
            private extern static IntPtr CreateActCtx(ref ACTCTX actctx);
    
            // Activation context structure 
            private struct ACTCTX
            {
                public int cbSize;
                public uint dwFlags;
                public string lpSource;
                public ushort wProcessorArchitecture;
                public ushort wLangId;
                public string lpAssemblyDirectory;
                public string lpResourceName;
                public string lpApplicationName;
            }
    
            private const int ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID = 0x004;
            private const int ACTCTX_FLAG_SET_PROCESS_DEFAULT = 0x00000010;
            private IntPtr m_hActCtx = (IntPtr)0;
            public const UInt32 ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET = 14011;
    
            /// <summary>
            /// Explicitly load a manifest and create the process-default activation 
            /// context. It takes effect immediately and stays there until the process exits. 
            /// </summary>
            static public void CreateActivationContext()
            {
                string rootFolder = AppDomain.CurrentDomain.BaseDirectory;
                string manifestPath = Path.Combine(rootFolder, "webapp.manifest");
                UInt32 dwError = 0;
    
                // Build the activation context information structure 
                ACTCTX info = new ACTCTX();
                info.cbSize = Marshal.SizeOf(typeof(ACTCTX));
                info.dwFlags = ACTCTX_FLAG_SET_PROCESS_DEFAULT;
                info.lpSource = manifestPath;
                if (null != rootFolder && "" != rootFolder)
                {
                    info.lpAssemblyDirectory = rootFolder;
                    info.dwFlags |= ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID;
                }
    
                dwError = 0;
    
                // Create the activation context 
                IntPtr result = CreateActCtx(ref info);
                if (-1 == result.ToInt32())
                {
                    dwError = (UInt32)Marshal.GetLastWin32Error();
                }
    
                if (-1 == result.ToInt32() && ActivationContext.ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET != dwError)
                {
                    string err = string.Format("Cannot create process-default win32 sxs context, error={0} manifest={1}", dwError, manifestPath);
                    ApplicationException ex = new ApplicationException(err);
                    throw ex;
                }
            }
        }
    }
    
    Imports System
    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Text
    Imports System.Web
    Imports System.Runtime.InteropServices
    Imports System.IO
    
    Namespace Microsoft.Samples.Synchronization
        Public Class ActivationContext
            ' Activation Context API Functions 
    
            <DllImport("Kernel32.dll", SetLastError := True)> _ 
            Private Shared Function CreateActCtx(ByRef actctx As ACTCTX) As IntPtr
            End Function
    
            ' Activation context structure 
            Private Structure ACTCTX
                Public cbSize As Integer
                Public dwFlags As UInteger
                Public lpSource As String
                Public wProcessorArchitecture As UShort
                Public wLangId As UShort
                Public lpAssemblyDirectory As String
                Public lpResourceName As String
                Public lpApplicationName As String
            End Structure
    
            Private Const ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID As Integer = &H4
            Private Const ACTCTX_FLAG_SET_PROCESS_DEFAULT As Integer = &H10
            Private m_hActCtx As IntPtr = DirectCast(0, IntPtr)
            Public Const ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET As UInt32 = 14011
    
            ''' <summary>
            ''' Explicitly load a manifest and create the process-default activation 
            ''' context. It takes effect immediately and stays there until the process exits. 
            ''' </summary>
            Public Shared Sub CreateActivationContext()
                Dim rootFolder As String = AppDomain.CurrentDomain.BaseDirectory
                Dim manifestPath As String = Path.Combine(rootFolder, "webapp.manifest")
                Dim dwError As UInt32 = 0
    
                ' Build the activation context information structure 
                Dim info As New ACTCTX()
                info.cbSize = Marshal.SizeOf(GetType(ACTCTX))
                info.dwFlags = ACTCTX_FLAG_SET_PROCESS_DEFAULT
                info.lpSource = manifestPath
                If rootFolder IsNot Nothing AndAlso "" <> rootFolder Then
                    info.lpAssemblyDirectory = rootFolder
                    info.dwFlags = info.dwFlags Or ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID
                End If
    
                dwError = 0
    
                ' Create the activation context 
                Dim result As IntPtr = CreateActCtx(info)
                If -1 = result.ToInt32() Then
                    dwError = DirectCast(Marshal.GetLastWin32Error(), UInt32)
                End If
    
                If -1 = result.ToInt32() AndAlso ActivationContext.ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET <> dwError Then
                    Dim err As String = String.Format("Cannot create process-default win32 sxs context, error={0} manifest={1}", dwError, manifestPath)
                    Dim ex As New ApplicationException(err)
                    Throw ex
                End If
            End Sub
        End Class
    End Namespace
    
  6. Теперь приложение готово к развертыванию в среде Windows Azure!

    Дополнительные сведения о развертывании приложения в среде Windows Azure см. в разделе Развертывание службы.

См. также

Другие ресурсы

Синхронизация SQL Server и SQL Server Compact