Я использую System.Timers.Timer
в своем приложении Asp.Net, и мне нужно использовать HttpServerUtility.MapPath
метод, который, похоже, доступен только через HttpContext.Current.Server.MapPath
. Проблема заключается в том, что HttpContext.Current
это , null
когда Timer.Elapsed
срабатывает событие.
Есть ли другой способ получить ссылку на объект HttpServerUtility? Я мог бы вставить его в конструктор своего класса. Это безопасно ? Как я могу быть уверен, что в конце текущего запроса не будет собран мусор?
Благодарность!
источник
Я не знаю, решит ли это проблему с виртуальными каталогами, но я использую это для MapPath:
public static string MapPath(string path) { if (HttpContext.Current != null) return HttpContext.Current.Server.MapPath(path); return HttpRuntime.AppDomainAppPath + path.Replace("~", string.Empty).Replace('/', '\\'); }
источник
HostingEnvironment - не идеальное решение, потому что это очень сложный класс для имитации (см. Как выполнить модульное тестирование кода, использующего HostingEnvironment.MapPath ).
Для тех, кому нужна возможность тестирования, лучшим способом может быть создание собственного интерфейса сопоставителя путей, предложенного https://stackoverflow.com/a/1231962/85196 , за исключением реализации его как
public class ServerPathMapper : IPathMapper { public string MapPath(string relativePath) { return HostingEnvironment.MapPath(relativePath); } }
Результат легко подделать, использует внутреннюю среду HostingEnvironment и потенциально может одновременно решить проблему ase69s .
источник
Разве нельзя перед запуском таймера вызвать функцию MapPath и просто кэшировать результат? Обязательно ли иметь вызов MapPath внутри события тика?
источник
Когда таймер истекает, текущий HTTP-контекст отсутствует. Это связано с тем, что события таймера не связаны с конкретным HTTP-запросом.
Что вам следует сделать, так это использовать HttpServerUtility.MapPath, где доступен HTTP-контекст. Это можно сделать в одном из событий конвейера запросов (например, Page_Load) или в событии Global.asax, например Application_Start.
Назначьте результат MapPath переменной, доступной из события Timer.Elapsed, где вы можете использовать Path.Combine для получения местоположения конкретного файла, который вам нужен.
источник
Я думаю, что причина того, почему в то время он имеет значение null (если вы думаете об этом), заключается в том, что событие, прошедшее с момента истечения таймера, не происходит как часть HTTP-запроса (следовательно, нет контекста). Это вызвано чем-то на вашем сервере.
источник