Текущий рабочий каталог в кодах ASP.NET - можем ли мы зависеть от этого? - PullRequest
7 голосов
/ 11 сентября 2010

Можем ли мы зависеть от текущего рабочего каталога в компонентах кода ASP.NET?Или, другими словами, можем ли мы использовать относительные пути и быть уверенными, что они будут работать?

Если на одной странице веб-сайта я задам текущему рабочему каталогу что-то конкретное, будет ли оно по-прежнемуто же самое в следующий раз, когда другая страница на сайте загружается?Когда загружается та же страница на веб-сайте?

Если я задаю текущему рабочему каталогу что-то конкретное, в Page_Load (), могу ли я быть уверен, что оно будет таким же к тому времени, когда Page_PreRender () будетназывается?Или другая страница на том же сайте может изменить это на меня, между?Может ли страница на другом веб-сайте в том же пуле приложений изменить это для меня?Страница на другом веб-сайте в другом пуле приложений?

Другими словами, какова область действия текущего рабочего каталога в IIS?Это специфично для страницы?Это специфично для веб-сайта?Или он распределяется между всеми страницами в пуле приложений?

Где, между страницей, веб-сайтом, пулом приложений и сервером, находятся границы, которые изолируют различные значения текущего рабочего каталога?

Ответы [ 3 ]

9 голосов
/ 19 января 2012

AppDomain.CurrentDomain.RelativeSearchPath даст вам физический путь к папке bin

5 голосов
/ 05 октября 2010

Environment.CurrentDirectory - это простая оболочка для функций winapi GetCurrentDirectory и SetCurrentDirectory . Действительно, попытка установить каталог требует разрешений UnmanagedCode. Всякий раз, когда какая-либо функция не позволяет вашему сайту работать с частичным доверием, вы вправе опасаться зависимости от нее. :)

Из документации SetCurrentDirectory:

Изменяет текущий каталог для текущего процесса .

Лучшее объяснение, которое я могу найти, касающееся взаимосвязи между процессом w3wp.exe и сайтом ASP.NET: этот ответ . Любая другая страница на вашем сайте может потенциально изменить текущий рабочий каталог вашей страницы. Любые страницы на любом другом сайте в том же пуле приложений могут потенциально изменить текущий рабочий каталог вашей страницы. Эти внешние изменения в текущем рабочем каталоге могут произойти в любое время во время выполнения вашей страницы. С другой стороны, страница на сайте в другом пуле приложений не изменит текущий рабочий каталог вашей страницы. Причина, по которой я говорю «возможно», заключается в том, что это становится еще сложнее, если вы рассматриваете сценарии веб-сада, где может быть несколько процессов для одного сайта ASP.NET.

Теперь учтите, что SetCurrentDirectory не является потокобезопасным:

Многопоточные приложения и общие код библиотеки не должен использовать Функция SetCurrentDirectory и следует избегать использования относительного пути имена. Текущее состояние каталога написанный SetCurrentDirectory функция хранится как глобальная переменная в каждом процессе, поэтому многопоточные приложения не могут надежно использовать это значение без возможно повреждение данных от других темы, которые также могут читать или установка этого значения. Это ограничение также относится к GetCurrentDirectory и Функции GetFullPathName. исключение, когда приложение гарантированно работает в один поток, например, разбор имена файлов из командной строки строка аргумента в основном потоке до создания каких-либо дополнительных потоки. Использование относительных имен путей в многопоточные приложения или общие код библиотеки может привести к непредсказуемости результаты и не поддерживается.

Скорее всего, вы не хотите зависеть от текущего рабочего каталога . Сказав это, учитывая, насколько глупо полагаться на текущий рабочий каталог, вы можете быть достаточно уверены, что никакой другой код не будет касаться его. :) Быстрый просмотр Reflector показывает, что никакой код .NET Framework не меняет его. Хотя некоторые функции это проверяют, так что следите за ними. Если вы контролируете среду развертывания, вы можете убедиться, что ваш сайт работает в собственном пуле приложений. При правильной технике синхронизации вы сможете безопасно обновить текущий рабочий каталог. Я бы не стал считать это чем-то другим, кроме взлома.

0 голосов
/ 11 сентября 2010

Ссылки должны быть созданы относительно корня сайта с помощью оператора тильды (~):

<a href="~/mysite/somepage.aspx" id="someLink" runat="server">Some Page</a>

Внутри сервера пул приложений полностью изолирует ваш сайт, так что, если какой-либо другой сайт выйдет из строя на том же сервере, он не остановит ваш сайт. IIS в значительной степени зависит от сайта с дополнительными преимуществами изоляции пулов приложений. Я не вижу практического смысла в попытках изменить ссылку на одной странице из кода на другую (или, может быть, я не совсем понимаю вопрос).

Вот краткое описание архитектуры IIS:

http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis-7/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...