Il progetto è basato su MVC WebAPI.Qual è il modo migliore per memorizzare nella cache i risultati di una serializzazione di json.net in memoria?
Stiamo passando il contesto di autorizzazione di un client ai nostri server API come oggetto JSON serializzato nelle intestazioni delle attestazioni della richiesta. Questo non è un oggetto enorme: 6 proprietà e una raccolta di coppie chiave-valore basate su enum (fino a 6 elementi qui)
L'ampia maggioranza delle richieste di API si verificano ogni minuto (alcune più frequentemente) dallo stesso set dei clienti. Probabilmente 700-900 clienti (e in crescita), ognuno che invia le stesse affermazioni all'infinito, ogni minuto.
Per ogni richiesta, vari componenti del codice deserializzano questo oggetto probabilmente 5-6 volte. Questa deserializzazione causa un significativo drenaggio della CPU sui server.
Quale sarebbe il modo migliore per memorizzare in cache queste deserializzazioni? Un oggetto dizionario statico con chiavi con stringhe JSON serializzate, funzionerebbe bene o la ricerca sarebbe troppo lenta, in quanto queste stringhe sarebbero di dimensioni decenti?
EDIT: ogni azione di ogni controller viene filtrata attraverso questo attributo per assicurarsi che le chiamate hanno autorizzazioni appropriate
public class AccountResolveAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext context)
{
var controller = (ControllerBase) context.ControllerContext.Controller;
var identity = (ClaimsIdentity) controller.User.Identity;
var users = identity.Claims
.Where(c => c.Type == ClaimTypes.UserData.ToString())
.Select(c => JsonConvert.DeserializeObject<UserInformation>(c.Value))
.ToList();
var accountId = controller.ReadAccountIdFromHeader();
if (users.All(u => u.AccountId != accountId))
{
throw new ApplicationException(string.Format("You have no rights for viewing of information on an account Id={0}", accountId));
}
}
}
Ci sono richieste anche nel controller di base che interroga rivendicazioni, ma AccountResolve potrebbe probabilmente memorizzare nella cache il risultato della prima deserializzazione nel controller in modo che quelle chiamate non provino a deserializzare nuovamente. Tuttavia, le affermazioni sono sempre le stesse e sto solo cercando di trovare un modo per ottimizzare per non deserializzare ancora e ancora la stessa stringa. Ho provato a memorizzare la stringa di serializzazione come chiave e risultato in memoria in un ConcurrentDictionary statico globale, ma non sembra aver aiutato
Si dice che vari componenti del codice deserializzano l'oggetto. Per curiosità, in che modo i componenti arrivano ai dati serializzati in primo luogo? Ad esempio: lo si ottiene dal principal del thread corrente, il principale viene passato come parametro, ecc.? –
Un'altra domanda oltre a quella che ho appena chiesto: stai usando un contenitore IoC e, in tal caso, quale? –
Yah, stiamo usando autofac – Igorek