Cache et global.asax

Résolu
SuperBouly Messages postés 410 Date d'inscription dimanche 1 février 2004 Statut Membre Dernière intervention 8 mai 2010 - 22 nov. 2006 à 19:05
SuperBouly Messages postés 410 Date d'inscription dimanche 1 février 2004 Statut Membre Dernière intervention 8 mai 2010 - 24 nov. 2006 à 07:41
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
A voir également:

5 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 nov. 2006 à 21:52
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
3
cs_jcq Messages postés 211 Date d'inscription vendredi 12 décembre 2003 Statut Membre Dernière intervention 15 janvier 2010
23 nov. 2006 à 14:27
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
0
SuperBouly Messages postés 410 Date d'inscription dimanche 1 février 2004 Statut Membre Dernière intervention 8 mai 2010
23 nov. 2006 à 15:51
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
0
SuperBouly Messages postés 410 Date d'inscription dimanche 1 février 2004 Statut Membre Dernière intervention 8 mai 2010
23 nov. 2006 à 17:49
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SuperBouly Messages postés 410 Date d'inscription dimanche 1 février 2004 Statut Membre Dernière intervention 8 mai 2010
24 nov. 2006 à 07:41
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
0
Rejoignez-nous