Невозможно программно создать клиентский DataCache в Azure только в облаке

У меня есть рабочая роль Azure, которая должна использовать кэш в AppFabric.

При локальном запуске (Win7x64,VS2010), указывающем на кеш в облаке, все работает нормально.

Когда я развертываю тот же пакет в облаке (снова указывая на тот же кеш), он выдает следующее исключение:

Message:         The type initializer for 'Microsoft.ApplicationServer.Caching.DataCacheClientLogManager' threw an exception. 
Exception Type:  TypeInitializationException 
StackTrace:      Microsoft.ApplicationServer.Caching.DataCacheClientLogManager.Initialize(DataCacheLogSink logSink) 
                 at Microsoft.ApplicationServer.Caching.DataCacheFactoryConfiguration.Initialize(String clientName) 
                 at CommunicationRole.CacheUtil.GetCache() 

Посмотрев на код, это происходит при попадании в эту строку кода:

Dim configuration As New DataCacheFactoryConfiguration()

Ничто не бежит после того, как эта линия нажата. Как я уже сказал, конфиги между локальным и облачным интерфейсом одинаковы. Я использую кеш с учетными данными в качестве поставщика состояния сеанса в веб-развертывании, поэтому я считаю, что кеш и доступ к нему хороши.

На моей сборочной машине установлен выпуск Azure SDK, выпущенный в ноябре 2011 года, и Azure AppFabric SDK 1.5.

Метод получения кэша заключается в следующем:

Imports System.IO
Imports Microsoft.WindowsAzure
Imports Microsoft.WindowsAzure.ServiceRuntime
Imports Microsoft.WindowsAzure.StorageClient
Imports Microsoft.ApplicationServer.Caching
Imports System.Security

Public Class CacheUtil

    Private Shared _factory As DataCacheFactory = Nothing
    Private Shared _cache As DataCache = Nothing

    Public Shared Function GetCache() As DataCache


            If _cache IsNot Nothing Then
                Return _cache
            End If

            '------------------------- 
            ' Configure Cache Client  
            '------------------------- 

            'Define Array for 1 Cache Host 
            Dim servers As New List(Of DataCacheServerEndpoint)()


            'Specify Cache Host Details  
            '  Parameter 1 = host name 
            '  Parameter 2 = cache port number 
            servers.Add(New DataCacheServerEndpoint(RoleEnvironment.GetConfigurationSettingValue("hostName"), Int32.Parse(RoleEnvironment.GetConfigurationSettingValue("cachePort"))))

            ' Setup secure key
            Dim strACSKey As String = RoleEnvironment.GetConfigurationSettingValue("authorisationToken")
            Dim secureACSKey As New SecureString
            For Each a As Char In strACSKey
                secureACSKey.AppendChar(a)
            Next
            secureACSKey.MakeReadOnly()
            Dim factorySecurity As New DataCacheSecurity(secureACSKey)

            'Create cache configuration 
            Dim configuration As New DataCacheFactoryConfiguration()

            configuration.Servers = servers
            configuration.SecurityProperties = factorySecurity

            'Disable tracing to avoid informational/verbose messages on the web page 
            DataCacheClientLogManager.ChangeLogLevel(System.Diagnostics.TraceLevel.Off)

            'Pass configuration settings to cacheFactory constructor 
            _factory = New DataCacheFactory(configuration)

            'Get reference to named cache called "default" 
            _cache = _factory.GetCache(RoleEnvironment.GetConfigurationSettingValue("cacheName"))


        Return _cache
    End Function

    Public Shared Sub Dispose()
        If _factory IsNot Nothing Then
            _factory.Dispose()
        End If
    End Sub

End Class

1 ответ

Решение

Выпуск SDK, выпущенный в ноябре 2011 года, включает файлы appfabric.dll (версия 1.6), поэтому вам больше не нужна отдельная установка SDK только для appfabric. Я бы попробовал пройтись по каждому из ваших проектов, удалив ссылки на кеширующие.dll и добавив их обратно, указав на те, которые находятся в...\Windows Azure SDK\v1.6\Cache\ref

Я обнаружил, что серверы сборки могут запутаться в том, какие библиотеки DLL использовать.

Другие вопросы по тегам