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

122

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

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

В этом контексте операция сервера недоступна.

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

Джон Бубриски
источник

Ответы:

295

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

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

Корбин Марч
источник
Есть ли предостережения в отношении этой техники?
Джон Бубриски
10
Нет. Если вы запустите Reflector, вы заметите, что Server.MapPath и Request.MapPath в конечном итоге вызывают VirtualPath.MapPath, который в конечном итоге вызывает HostingEnvironment.MapPath. Все они оказываются в одном месте. HostingEnvironment.MapPath исключает среднего человека.
Корбин
1
+1 это исправило проект с открытым исходным кодом, который работал у меня, а затем просто прекратил инициализацию из-за того, что HttpContext.Current.Server взорвался из-за отсутствия контекста по какой-то причине. Переключение на это вернуло его к плавному плаванию.
Крис Марисич, 04
4

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

Киран Банда
источник
1

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

context.Server.mappath ()

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

tekBlues
источник
В ContextGlobal.asax нет никаких гарантий .
Андерс Торнблад 06
-3

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

VoltaicShock
источник
2
Вы можете ссылаться на него таким образом в классах, которые на самом деле ИМЕЮТ HttpContext, но я не думаю, что у global.asax он есть, поэтому я получил сообщение об ошибке.
Джон Бубриски