2008-09-20 12 views
7

Я работаю с планировщиком DotNetNuke для планирования задач, и я ищу, чтобы получить физический путь к файлу созданного мной шаблона электронной почты. Проблема в том, что HttpContext имеет значение NULL, потому что запланированная задача находится в другом потоке, и нет HTTP-запроса. Как вы можете получить физический путь файла?В ASP.NET, как вы получаете физический путь к файлу, когда HttpContext.Current является NULL?

ответ

13

System.Web.Hosting.HostingEnvironment.MapPath - это то, что вы ищете. Всякий раз, когда вы используете объекты Server или HttpContext.Current, сначала проверьте, есть ли у HostingEnvironment то, что вам нужно.

+0

что делать, если вы находитесь за пределами веб-проекта, но хотите скажем, попасть в папку изображений вашего веб-проекта, чтобы захватить изображение или прочитать, скажем, содержимое файла .htm, что сайты на вашем сайте, но у вас есть метод утилиты, который вы хотите вызвать снаружи, чтобы попасть в этот файл? – PositiveGuy

+0

Если вы находитесь за пределами веб-проекта, я бы подумал, что в любом случае вам понадобится собственный код для поиска веб-проекта. Как только вы получите это, вы можете просто продолжать следовать этому пути без специального помощника, такого как «MapPath». – bdukes

0

Поскольку этот процесс действительно вне диапазона по отношению к веб-сайту, возможно, вы можете просто поместить путь в файл конфигурации.

Не может быть лучшей идеей, но это альтернатива.

0

Что говорит об этом.GetType(). Assembly.Location?

+1

Он возвращает c: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Временные файлы ASP.NET \ mywebsite \ 50f1a686 \ ab5b581d \ App_Code.xkcsxvg6.dll – John

0

Вы можете посмотреть на Актовом & на 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 ... 
1

Существует много способов сделать это, я лично обойду его, сохранив информацию о пути в качестве опции конфигурации для своих модулей, она не изящна, но работает и работает каждый раз.

Joe Brinkman Я верю, что где-то в другом месте есть блог, посвященный тому, как построить новый HTTPContext для использования внутри планировщика.

+0

Для будущих читателей статьи Джо Бринкмана [здесь, для оригинальной версии] (http://www.dnnsoftware.com/community-blog/cid/135304/the-quest-for-the-dotnetnuke-holy-grail) и [здесь для обновленной версии] (http://www.dnnsoftware.com/community-blog/cid/137009/new-and-improved-holy-grail). – AaronSieb