Cache et global.asax [Résolu]

Signaler
Messages postés
410
Date d'inscription
dimanche 1 février 2004
Statut
Membre
Dernière intervention
8 mai 2010
-
Messages postés
410
Date d'inscription
dimanche 1 février 2004
Statut
Membre
Dernière intervention
8 mai 2010
-
Bonjour,


Je travaille en ASP.NET 2 langageVB et VS2005


Je désire mettre en cache un dataset quand l'application démarre.Dans Sub Application_Start je fais:<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>



 





'1 je cree le dataset "
MonDataSet"

------

Je passe les détails

-----

'2. Je le recopie dans un fichier Xml (Qui sera actualisé quand les données changent : pour ce cas, rarement), du répertoire "CacheXml"

MonDataSet.WriteXml(Server.MapPath("CacheXml/CacheMonDataSet.xml"))

'3. Je le mets en cache


Cache.Insert

("tarifs", dsTarifs, New CacheDependency(Server.MapPath("CacheXml/ CacheMonDataSet.xml"))) 
Eh bien cette instruction qui marchait parfaitement dans une page quelconque n'est pas autorisée dans le global.asax....
Je me la fait souligner en bleu avec le verdict :
Erreur  1          Une référence à un membre non partagé requiert une référence d'objet.   
Pourquoi ? et comment résoudre ce problème?



merci de vos lumières
@+Gilles

5 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Salut,

Cache dans la page est une propriété de l'objet Page qui est une méthode type System.Web.Caching.Cache

dans global.asax, Cache est le type System.Web.Caching.Cache (mais pas une instance) or Insert n'est pas une méthode static (shared) mais une méthode d'instance donc il te faut une instance de l'objet Cache pour Insérer qqchose dans le cache.

Mais le code Global.asax est une instance de HttpApplication (j'ai un doute la mais je suis trop crevé pour vérifier :p) et dans cet objet tu as la méthode Context qui est une instance de HttpContext qui contient une propriété Cache qui est une instnce de ... (suspens) System.Web.Caching.Cache ... donc dans ton global.asax tu peux faire this.Context.Cache.Insert ... Le truc que je ne suis pas sur et que je me souviens plus quand cet objet est instancié l'évenement application_start est vraiment le tout début de l'application donc il se peut que cet objet soit pas encore instancié (mais je pense que oui)

En ce qui concerne le message d'erreur, ca vient du fait que tu appelles une méthode d'instance comme une méthode static

<hr />Cyril - MVS - MCP
Messages postés
211
Date d'inscription
vendredi 12 décembre 2003
Statut
Membre
Dernière intervention
15 janvier 2010

je crois que ça vient de ton Server.MapPath qui n'est pas autorisé dans le Global.asax... (pas le temps de mieux regardé en ce moment)

Bart-Rennes
Messages postés
410
Date d'inscription
dimanche 1 février 2004
Statut
Membre
Dernière intervention
8 mai 2010

Server.MapPath marche parfaitement, j'en ai un juste avant qui fonctionne. c'est le cache.insert qui pose pb, mais tu as raison,  les arguments en posent peut-être un aussi..
@+Gilles
Messages postés
410
Date d'inscription
dimanche 1 février 2004
Statut
Membre
Dernière intervention
8 mai 2010

Au secours, les théoriciens, je ne comprends pas l'erreur renvoyée !
 Une référence à un membre non partagé requiert une référence d'objet.   
une piste par pitié !
@+G
Messages postés
410
Date d'inscription
dimanche 1 février 2004
Statut
Membre
Dernière intervention
8 mai 2010

Bonjour
un grand merci pour ta réponse détaillée.
effectivement, en tête de la page de code du global.asax, il y a:

Public Class [Global]
    Inherits System.Web.HttpApplication

Comme je suis en VB j'ai mis Me.Context.Cache.Insert ...  et ça va bien.

A noter la soluce de rechange: Faire remplir le cache sur la première page avec la condition:
      if Ctype(Cache("tarifs"),DataSet) is Nothing then
            ---remplir le cache---
      end if

@+Gilles