Как я могу использовать 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


1

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

context.Server.mappath ()

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


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

-3

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


2
Вы можете ссылаться на него таким образом в классах, которые на самом деле ИМЕЮТ HttpContext, но я не думаю, что у global.asax он есть, поэтому я получил сообщение об ошибке.
Джон Бубриски
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.