2012-08-09 22 views
7

Usando VS2012 he añadido la característica de almacenamiento en caché del almacenamiento en caché Tab WebRole Propiedades. Entre otros, generó el siguiente XML en web.config:azul almacenamiento en caché de ubicación conjunta

<dataCacheClients> 
    <tracing sinkType="DiagnosticSink" traceLevel="Error" /> 
    <dataCacheClient name="default"> 
     <autoDiscover isEnabled="true" identifier="[cluster role name]"/> 
     <!-- <localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" /> --> 
    </dataCacheClient> 
    </dataCacheClients> 

Muy bien, genial. Reemplacé el [nombre del rol del clúster] con el nombre del rol web, di "helloworld.web". Ahora, cuando se crea el objeto DataCacheFactory o DataCache:

_dataCacheFactory = new DataCacheFactory(); 
    _defaultCache = _dataCacheFactory.GetDefaultCache(); 

    //Or, just this line 
    _defaultCache = new DataCache(@"default"); 

me sale el siguiente error:

Microsoft.ApplicationServer.Caching.DataCacheException was unhandled 
    HelpLink=http://go.microsoft.com/fwlink/?LinkId=164049 
    HResult=-2146233088 
    Message=ErrorCode<ERRCA0021>:SubStatus<ES0001>:Server collection cannot be empty. 
    Source=Microsoft.ApplicationServer.Caching.Client 
    ErrorCode=21 
    SubStatus=-1 

Some notes: 
IDE: VS2012, 
Framework: 4.0 
AzureSDK: June2012 
Local dev machine 

¿Qué me falta?

Editar

Yo tengo que trabajar!

que estaba creando el DataCacheFactory en el método WebRole OnStart, lo moví a Application_Start en Global.asax y parece estar funcionando.

Sandrino explica por qué este es el caso: https://stackoverflow.com/a/11886136/1374935

Respuesta

6

En su pregunta habla de agregar el XML al web.config, esto funciona para la aplicación web alojada en su función web (es por eso que el código funciona al usarlo en el método Application_Start).

pero hay que saber que el código en el WebRole.cs ejecuta en un proceso diferente (incluso antes de Startin la aplicación web). Es por eso que no puede leer desde su web.config y esa es la razón por la que parecía que no había ningún servidor configurado.

Con el fin de hacer que el código también trabajar desde sus WebRole.cs tendrá que añadir el XML en el archivo de configuración para el proceso que se ejecuta el código. Su código se ejecuta en el proceso WaIISHost.exe, por lo que deberá crear un nuevo archivo de configuración WaIISHost.exe.config, agregar el XML en este archivo y cambiar la propiedad Copiar al directorio de salida para ese archivo a " Copia siempre ".

Leer más sobre este proceso WaIISHost.exe aquí: New Full IIS Capabilities: Differences from Hosted Web Core

1

Yo tengo que trabajar!

que estaba creando el DataCacheFactory en el método WebRole OnStart, lo moví a Application_Start en Global.asax y parece estar funcionando.

+0

me gustaría saber por qué, sin embargo, y donde sería el mejor lugar para poner el código que inicializa ciertas operaciones tales como la creación de tablas azules, la creación de conexiones de caché, etc. para una aplicación ASP.NET MVC. – States

+0

Consulte: http://stackoverflow.com/a/11886136/1374935 – States

+1

Tengo exactamente el mismo problema pero estoy iniciando la caché desde un controlador MVC. No he hecho nada en Appplication_start. Alguna idea, ¿es un problema similar y me falta algo en la startup? –

1

Sí. Paso a través de varias configuraciones y reinstalé las herramientas de Azure también durante mi resolución de problemas.

Existe la Web.config que se menciona más arriba, pero en su definición de servicio, asegúrese de que tiene una línea:

<Import moduleName="Caching" /> 

Ésta era mi problema de raíz, pero luego había cambiado casi todo lo que una vez tratando de conseguir para que funcione Además, cuando miré la función web, faltaba la pestaña Caché, que se solucionó al volver a instalar las herramientas de Azure (hice una limpieza de las antiguas que pueden o no haber ayudado). Lo inicié a través de los ejemplos del sitio Azure en lugar de lo que está arriba.

DataCache AgencyCache = new DataCache("AgencyDataValidation"); 

recordando a importar:

using Microsoft.ApplicationServer.Caching; 
Cuestiones relacionadas