Ich verwende a System.Timers.Timer
in meiner Asp.Net-Anwendung und muss die HttpServerUtility.MapPath
Methode verwenden, die anscheinend nur über verfügbar ist HttpContext.Current.Server.MapPath
. Das Problem ist , dass HttpContext.Current
ist , null
wenn das Timer.Elapsed
Ereignis ausgelöst wird .
Gibt es eine andere Möglichkeit, einen Verweis auf ein HttpServerUtility-Objekt abzurufen? Ich könnte es in den Konstruktor meiner Klasse injizieren. Ist es sicher ? Wie kann ich sicher sein, dass am Ende der aktuellen Anforderung kein Müll gesammelt wird?
Vielen Dank!
quelle
Ich weiß nicht, ob dies Ihr Problem mit virtuellen Verzeichnissen lösen wird, aber ich verwende dies für MapPath:
quelle
HostingEnvironment ist nicht die perfekte Lösung, da es eine sehr schwer zu verspottende Klasse ist (siehe So erstellen Sie Unit-Test-Code, der HostingEnvironment.MapPath verwendet ).
Für diejenigen, die Testbarkeit benötigen, ist es möglicherweise besser, eine eigene Path-Mapper-Schnittstelle zu erstellen, wie von vorgeschlagen https://stackoverflow.com/a/1231962/85196 , außer sie als zu implementieren
Das Ergebnis ist leicht zu verspotten, verwendet HostingEnvironment intern und kann möglicherweise gleichzeitig das Problem von ase69s angehen .
quelle
Können Sie die MapPath-Funktion nicht vor dem Starten des Timers aufrufen und das Ergebnis einfach zwischenspeichern? Ist es unbedingt erforderlich, dass der MapPath-Aufruf innerhalb des Tick-Ereignisses erfolgt?
quelle
Wenn der Timer abgelaufen ist, gibt es keinen aktuellen HTTP-Kontext. Dies liegt daran, dass die Timer-Ereignisse nicht mit einer bestimmten HTTP-Anforderung verknüpft sind.
Sie sollten HttpServerUtility.MapPath verwenden, wenn der HTTP-Kontext verfügbar ist. Sie können dies in einem der Anforderungspipeline-Ereignisse (z. B. Page Load) oder in einem Global.asax-Ereignis wie Application_Start tun.
Weisen Sie das MapPath-Ergebnis einer Variablen zu, auf die über das Ereignis Timer.Elapsed zugegriffen werden kann. Mit Path.Combine können Sie den Speicherort einer bestimmten Datei ermitteln, die Sie benötigen.
quelle
Ich denke, der Grund, warum es zu diesem Zeitpunkt null ist (wenn Sie darüber nachdenken), ist, dass das Ereignis "Timer abgelaufen" nicht als Teil einer HTTP-Anforderung auftritt (daher gibt es keinen Kontext). Es wird durch etwas auf Ihrem Server verursacht.
quelle