В ASP.NET, как получить физический путь к файлу, когда HttpContext.Current равен NULL?
Я работаю с планировщиком DotNetNuke, чтобы планировать задачи, и я ищу, чтобы получить физический путь к файлу шаблона электронной почты, который я создал. Проблема в том, что HttpContext имеет значение NULL, потому что запланированная задача находится в другом потоке, а запрос http отсутствует. Как бы вы получили физический путь к файлу?
5 ответов
System.Web.Hosting.HostingEnvironment.MapPath - это то, что вы ищете. Всякий раз, когда вы используете объекты Server или HttpContext.Current, сначала проверьте, имеет ли HostingEnvironment то, что вам нужно.
Есть много способов сделать это, я лично обхожу это путем хранения информации о пути в качестве опции конфигурации для моих модулей, это не элегантно, но это работает и работает каждый раз.
У Джо Бринкмана, как я полагаю, где-то есть пост в блоге о том, как создать новый HTTPContext для использования внутри планировщика.
Поскольку этот процесс действительно внеполосный по отношению к веб-сайту, возможно, вы можете просто указать путь в файле конфигурации.
Возможно, не лучшая идея, но это альтернатива.
Можете ли вы взглянуть на сборку и пути CodeBase следующим образом:
Imports System.Reflection
Imports System.IO
...
Path.GetDirectoryName( Assembly.GetExecutingAssembly().CodeBase )
Такие вещи не всегда работают, поэтому я бы порекомендовал написать журнал с кучей данных о сборке, чтобы увидеть, что работает в этом месте. Это то, что мне нужно было сделать, чтобы получить нечто подобное, когда я создавал COM-компонент для размещения в AppCenter. Я использовал это, чтобы "получить" то, что должно быть "APP_BASE", и установить его так, чтобы файл app.config загружался правильно.
Log.Write ( Assembly.GetExecutingAssembly().CodeBase )
Log.Write ( Assembly.GetExecutingAssembly().Location )
Log.Write ( Path.GetFullPath(".") )
Log.Write ( Application.StartupPath )
... and so on, whatever you can think of ...