asp.net mvc azure “Errore nell’accesso all’archivio dati!”

Ho iniziato a utilizzare il codice AspProviders per archiviare i dati della sessione nella memoria della tabella.

Sto ottenendo sporadicamente il seguente errore:

Descrizione: è stata generata un’eccezione di tipo “System.Web.HttpException”. INNER_EXCEPTION: errore durante l’accesso all’archivio dati! INNER_EXCEPTION: si è verificato un errore durante l’elaborazione di questa richiesta. INNER_EXCEPTION: ConditionNotMet La condizione specificata utilizzando le intestazioni condizionali HTTP non viene soddisfatta. RequestId: 0c4239cc-41fb-42c5-98c5-7e9cc22096af Ora: 2010-10-15T04: 28: 07.0726801Z StackTrace: System.Web.SessionState.SessionStateModule.EndAcquireState (IAsyncResult ar) System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion (IAsyncResult ar INNER_EXCEPTION: Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider.ReleaseItemExclusive (contesto HttpContext, ID stringa, Object lockId) in \ Azure \ AspProviders \ TableStorageSessionStateProvider.cs: riga 484 System.Web.SessionState.SessionStateModule.GetSessionStateItem () System.Web .SessionState.SessionStateModule.PollLockedSessionCallback (stato dell’object) INNER_EXCEPTION: Microsoft.WindowsAzure.StorageClient.Tasks.Task 1.get_Result() Microsoft.WindowsAzure.StorageClient.Tasks.Task 1.ExecuteAndWait () Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteImplWithRetry [ T] (Func`2 impl, politica RetryPolicy) Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider.ReleaseItemExclusive (Tabl eServiceContext svc, sessione SessionRow, Object lockId) in \ Azure \ AspProviders \ TableStorageSessionStateProvider.cs: riga 603 Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider.ReleaseItemExclusive (contesto HttpContext, ID stringa, Object LockId) in \ Azure \ AspProviders \ TableStorageSessionStateProvider. cs: line 480 INNER_EXCEPTION: System.Data.Services.Client.DataServiceContext.SaveResult.d__1e.MoveNext ()

Qualcuno si imbatte in questo? L’unica informazione utile che ho trovato è questa, che sono riluttante a fare:

Se si desidera ignorare la convalida, è ansible aprire TableStorageSessionStateProvider.cs, trovare ReleaseItemExclusive e modificare il codice da:

svc.UpdateObject (sessione);

a:

svc.Detach (sessione);
svc.AttachTo (“Sessions”, session, “*”);
svc.UpdateObject (sessione);

da qui

Grazie!

Quindi ho deciso di cambiare questo:

svc.UpdateObject (sessione); svc.SaveChangesWithRetries ();

a questa:

prova {svc.UpdateObject (session);

 svc.SaveChangesWithRetries(); 

} catch {svc.Detach (session); svc.AttachTo (“Sessions”, session, “*”); svc.UpdateObject (sessione);

 svc.SaveChangesWithRetries(); 

}

Quindi, vedrò come funziona …

Ho riscontrato anche questo problema e dopo alcune indagini sembra accadere più spesso quando si dispone di più di un’istanza e si tenta di effettuare chiamate in rapida successione nella stessa sessione. (es. se hai una casella di completamento automatico e fai chiamate ajax su ogni pressione di un tasto)

Ciò si verifica perché quando si tenta di accedere ai dati della sessione, prima di tutto il server Web prende un blocco su quella sessione. Quando la richiesta è completa, rilascia il blocco. Con il fornitore di servizi di tabelle, aggiorna questo stato di blocco aggiornando un campo nella tabella. Quello che penso stia accadendo è che Instance1 carica la riga della sessione, quindi Instance2 carica la riga della sessione, Instance1 salva lo stato del blocco aggiornato e quando Instance2 tenta di salvare lo stato del blocco riceve un errore perché l’object non si trova nello stesso stato come quando è stato caricato (l’ETag non corrisponde più).

Questo è il motivo per cui la correzione trovata arresta l’errore, perché specificando il simbolo “*” nell’Allegato, quando Instance2 tenta di salvare il blocco distriggers il controllo ETag (e sovrascrive le modifiche apportate da Instance1).

Nella nostra situazione abbiamo modificato il provider in modo da poter distriggersre la sessione per determinati percorsi (la chiamata ajax che ci dava i nostri problemi non aveva bisogno di accedere ai dati della sessione, né il caricamento delle immagini) che potrebbe essere un’opzione per a seconda di cosa sta causando il tuo problema.

Sfortunatamente TableStorageSessionStateProvider fa parte dei progetti di esempio e quindi non lo è (per quanto ne so, ma mi verrà detto diversamente) ufficialmente supportato da Microsoft. Ha altri problemi, come il fatto che non ripulisce i dati della sessione una volta scaduta una sessione, quindi finirai con un sacco di cianfrusaglie nella tabella della sessione e nel contenitore blob che dovrai pulire un po ‘di altro modo.