ASP.NET ne peut pas mettre en cache la valeur null
Quelqu'un peut-il expliquer pourquoi vous ne pouvez pas insérer un objet null dans le ASP.NET cache?
string exampleItem = null;
HttpRuntime.Cache.Insert("EXAMPLE_KEY",
exampleItem,
Nothing,
DateTime.Now.AddHours(1),
System.Web.Caching.Cache.NoSlidingExpiration);
L'exception message d'erreur indique que la "valeur" de l'objet ne peut pas être null. Dans mon application il y a des raisons valables devrait nous voulons pour stocker une valeur null dans le cache.
source d'informationauteur Kane
Vous devez vous connecter pour publier un commentaire.
Sous-jacent
Cache
est probablement unHashtable
ouDictionary<string, object>
dont les méthodes ne font pas la différence entre " pas de valeur à une clé ou une valeur null à la clé.Envisager une utilisation de l'espace réservé "null", similaire à
DbNull.Value
.De clarifier Michael Petrotta accepté de répondre un peu (trop long pour un commentaire, j'en ai peur), le béton implémentations de CacheInternal (CacheSingle et CacheMultiple, dont le dernier simple permet de gérer plusieurs instances de l'ancien), qui est ce qui est utilisé en interne par le public type de Cache à l'appui de ses Obtenir, d'Ajouter, Insérer, etc. méthodes, ne s'appuient sur une table de hachage pour le stockage. Toutefois, il n'est jamais question de savoir s'il est ou n'est pas une valeur pour une clé dans la table de hachage, parce que le natif (en cache) les valeurs ne sont pas stockées dans la table de hachage directement. Au lieu de cela, la table de hachage est rempli avec de l'unique CacheEntry objets qui enveloppent la mise en cache des clés et des valeurs (CacheEntry dérivent en fait de CacheKey, l'ajout d'un Objet en fonction de la Valeur de la propriété, entre autres choses, la valeur non nulle exigence peut être trouvé dans son constructeur).
Basé sur ma lecture du code, il n'est pas évident de raison technique pour les auteurs d'avoir requis un non-null CacheEntry.Valeur, à l'exception que le public objet Cache n'expose pas de Contient - ou Existe-type de méthode, et bien sûr ne pas exposer l'interne sous-jacente CacheEntry objets, il retourne uniquement le CacheEntry valeurs. Donc, comme par Michael réponse, sans forcer les valeurs non-nulles, il n'est pas possible pour objet Cache à l'utilisateur de savoir si une valeur de clé existe. Il est également possible, mais aurait besoin de plus de la lecture de code à sais pour sûr, que la plutôt complexe approche prises en interne pour gérer le cache des dépendances, expirations, les événements, et les mises à jour de la table de hachage entrées peut s'appuyer, d'une certaine façon, sur les valeurs non-null.
Comme une alternative possible ou, vous pouvez au lieu de stocker un objet plutôt que votre valeur. Par exemple (ce qui suppose que votre valeur est une chaîne, mais il pourrait être générique)
...
De cette façon, vous n'êtes jamais d'insérer la valeur null. Pour obtenir la valeur de retour, vous venez de le sortir de l'emballage:
(C'est tout en haut de ma tête, alors, toutes mes excuses pour n'importe quel idiot de fautes de frappe.)