2012-08-09 9 views
7

Utilizzo di VS2012 Ho aggiunto la funzione di memorizzazione nella cache dalla scheda Caching delle proprietà di WebRole. Tra gli altri, ha generato il seguente codice XML in web.config:Implementazione della memorizzazione nella cache coclea blu

<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> 

Ok, fantastico. Ho sostituito il [nome ruolo del cluster] con il nome della webrole, diciamo "helloworld.web". Ora, quando creo la DataCacheFactory o DataCache oggetto:

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

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

ottengo il seguente errore:

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 

Che cosa mi manca?

Modifica

ho preso a lavorare!

Stavo creando DataCacheFactory nel metodo WebRole OnStart, l'ho spostato su Application_Start in Global.asax e sembra funzionare.

Sandrino spiega perché questo è il caso: https://stackoverflow.com/a/11886136/1374935

risposta

6

Nella tua domanda parli di aggiungere l'XML al web.config, questo funziona per l'applicazione Web ospitata nel tuo ruolo Web (ecco perché il codice funziona quando lo si utilizza nel metodo Application_Start).

Ma è necessario sapere che il codice in WebRole.cs viene eseguito in un processo diverso (anche prima dell'avvio dell'applicazione Web). Ecco perché non può leggere dal tuo web.config e questa è la ragione per cui sembrava che non ci fosse alcun server configurato.

Per fare in modo che il codice funzioni anche su WebRole.cs, è necessario aggiungere l'XML nel file di configurazione per il processo che esegue quel codice. Il codice viene eseguito nel processo WaIISHost.exe, quindi sarà necessario creare un nuovo file di configurazione WaIISHost.exe.config, aggiungere l'XML in questo file e modificare la proprietà Copia in Output Directory per tale file " Copia sempre ".

Per saperne di più su questo processo WaIISHost.exe qui: New Full IIS Capabilities: Differences from Hosted Web Core

1

ho preso a lavorare!

Stavo creando DataCacheFactory nel metodo WebRole OnStart, l'ho spostato su Application_Start in Global.asax e sembra funzionare.

+0

Vorrei sapere perché, però, e dove sarebbe il posto migliore per mettere il codice che inizializza alcune operazioni come la creazione di tabelle azzurre, la creazione di connessioni di cache, ecc per un'applicazione ASP.NET MVC. – States

+0

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

+1

Ho esattamente lo stesso problema ma avvio della cache da un controller MVC. Non ho fatto nulla in Appplication_start. Qualche idea, è un problema simile e mi manca qualcosa all'avvio? –

1

Sì. Passo però le varie configurazioni e ho reinstallato gli strumenti di Azure anche durante la mia risoluzione dei problemi.

C'è il web.config di cui si parla sopra, ma nella definizione di servizio, assicurarsi che ha una linea:

<Import moduleName="Caching" /> 

Questo era il mio problema principale, ma poi aveva cambiato quasi tutto, una volta cercando di ottenere funziona. Inoltre, quando ho esaminato il ruolo web, mancava la scheda Caching, che è stata riparata reinstallando gli strumenti di Azure (ho ripulito quelli vecchi che potevano o meno aver aiutato). L'ho avviato tramite gli esempi di sito di Azure piuttosto che sopra.

DataCache AgencyCache = new DataCache("AgencyDataValidation"); 

ricordando di importazione:

using Microsoft.ApplicationServer.Caching;