J'utilise un System.Timers.Timer
dans mon application Asp.Net et je dois utiliser la HttpServerUtility.MapPath
méthode qui semble être uniquement disponible via HttpContext.Current.Server.MapPath
. Le problème est que HttpContext.Current
c'est null
lorsque l' Timer.Elapsed
événement se déclenche.
Existe-t-il un autre moyen d'obtenir une référence à un objet HttpServerUtility? Je pourrais l'injecter dans le constructeur de ma classe. Est-ce sûr ? Comment puis-je être sûr qu'il ne sera pas récupéré à la fin de la demande en cours?
Merci!
la source
Je ne sais pas si cela résoudra votre problème de répertoires virtuels, mais j'utilise ceci pour MapPath:
la source
HostingEnvironment n'est pas la solution parfaite car il s'agit d'une classe très difficile à simuler (voir Comment tester un code de test qui utilise HostingEnvironment.MapPath ).
Pour ceux qui ont besoin de testabilité, un meilleur moyen pourrait être de créer votre propre interface de mappeur de chemin comme proposé par https://stackoverflow.com/a/1231962/85196 , sauf l'implémenter comme
Le résultat est facilement mockable, utilise HostingEnvironment en interne et pourrait même potentiellement répondre aux préoccupations de ase69s en même temps.
la source
Ne pouvez-vous pas appeler la fonction MapPath avant de démarrer le minuteur et simplement mettre en cache le résultat? Est-il absolument nécessaire d'avoir l'appel MapPath à l'intérieur de l'événement tick?
la source
Lorsque le minuteur s'est écoulé, il n'y a pas de contexte HTTP actuel. Cela est dû au fait que les événements du minuteur ne sont pas liés à une requête HTTP spécifique.
Ce que vous devez faire est d'utiliser HttpServerUtility.MapPath où le contexte HTTP est disponible. Vous pouvez le faire dans l'un des événements de pipeline de demande (tels que Page Load) ou dans un événement Global.asax tel que Application_Start.
Attribuez le résultat MapPath à une variable accessible à partir de l'événement Timer.Elapsed, où vous pouvez utiliser Path.Combine pour obtenir l'emplacement d'un fichier spécifique dont vous avez besoin.
la source
Je pense que la raison pour laquelle il est nul à ce moment-là (si vous y réfléchissez), est que l'événement du minuteur écoulé ne se produit pas dans le cadre d'une requête HTTP (il n'y a donc pas de contexte). Cela est dû à quelque chose sur votre serveur.
la source