Как я могу использовать Server.MapPath() из global.asax?

Мне нужно использовать Server.MapPath() для объединения путей к некоторым файлам, которые я храню в папке web.config.

Однако, поскольку Server.MapPath() полагается на текущий HttpContext (я думаю), я не могу этого сделать. При попытке использовать этот метод, даже если он «доступен», я получаю следующее исключение:

Работа сервера в этом контексте недоступна.

Есть ли другой метод, который может отображать относительный веб-каталог, такой как ~/App_Data/, на полный физический путь, такой как C:\inetpub\wwwroot\project\App_data\?


person John B    schedule 01.06.2009    source источник


Ответы (4)


Вы можете попробовать System.Web.Hosting.HostingEnvironment. Путь к карте().

HttpContext не требуется.

person Corbin March    schedule 01.06.2009
comment
Есть ли предостережения к этой технике? - person John B; 03.06.2009
comment
Неа. Если вы запустите Reflector, вы заметите, что Server.MapPath и Request.MapPath в конечном итоге вызывают VirtualPath.MapPath, который в конечном итоге вызывает HostingEnvironment.MapPath. Все они заканчиваются в одном месте. HostingEnvironment.MapPath исключает посредника. - person Corbin March; 03.06.2009
comment
+1 это исправило проект с открытым исходным кодом, который работал у меня, а затем просто перестал инициализироваться из-за того, что HttpContext.Current.Server взорвался из-за того, что по какой-то причине у него не было контекста. Переключение на это вернуло его к плавному плаванию. - person Chris Marisic; 04.03.2011

Используйте AppDomain.CurrentDomain.BaseDirectory, потому что Context может вернуть значение null !!

person Kiran Banda    schedule 02.02.2010

В Global.asax используйте объект context:

контекст.Сервер.mappath()

Контекст также позволяет вам получить доступ к коллекции сеансов, объекту запроса, объекту ответа. Очень полезно, когда вы хотите регистрировать ошибки, например

person tekBlues    schedule 01.06.2009
comment
В Global.asax нет гарантированного Context. - person Anders Marzi Tornblad; 06.02.2017

Вы можете попробовать HttpContext.Current.Server.MapPath("/") - так я ссылался на него раньше в классах.

person VoltaicShock    schedule 01.06.2009
comment
Вы можете ссылаться на него таким образом в классах, которые на самом деле ИМЕЮТ HttpContext, но я не думаю, что у global.asax он есть, поэтому я получил сообщение об ошибке. - person John B; 01.06.2009