Почему нам нужно использовать «~/» в начале расширений пути к файлу?

Я пытаюсь изучить ASP.NET Core. Я все еще на начальном уровне. Извините, если мой вопрос слишком простой.

Я хочу получить доступ к изображению CoreBlogTeam/web/images/b1.jpg из /Views/Blog/BlogReadAll.cshtml:

<img src = "~/CoreBlogTema/web/images/b1.jpg"
<img src = "/CoreBlogTema/web/images/b1.jpg"

Оба расширения файлов img работают.

Я исследовал темы «Физический путь», «Виртуальный путь» или «Относительный виртуальный путь».

"../" //the parent directory
"/" //the site root directory

Я понял такую ​​информацию, как. Но я до сих пор не понимаю необходимости использования "~/". Я все еще работаю над небольшими проектами на своем компьютере. Я еще не работал над серверной частью, возможно, поэтому мне трудно в этом разобраться. Если я использую «/» вместо «~/», я указываю корневой каталог, и путь к файлу работает.

В просмотренных мной обучающих видеороликах используется «~/», но причина этого не объясняется.

Почему мы должны использовать «~/»? Я думаю, что это необходимое условие на стороне сервера, но я его не до конца понимаю.

Еще раз извините, если это простой вопрос. Я еще не работал на стороне сервера.

Спасибо.

Отвечает ли это на ваш вопрос? Разница между ./ и ~/

tripleee 15.06.2024 18:30
~ — это специфическое для оболочки сокращение домашнего каталога текущего пользователя. Имеет ли это смысл или целесообразность, зависит от того, как настроен ваш веб-сервер.
chepner 15.06.2024 18:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет, это не имеет ничего общего с вашим домашним каталогом Unix ~ - оно предназначено для очень специфичной для Microsoft IIS цели (хотя веб-серверы Apache использовали ~ для этого, но это уже другая история).


В ASP.NET использование ~/ в начале пути URI означает, что путь является относительным к корню приложения - то есть похож на путь /foo/bar относительно корня веб-сайта, но позволяет поднимать все веб-приложение. и перенесен в очевидный подкаталог, и такие вещи, как межстраничные ссылки, по-прежнему будут работать правильно.


Более детально:

Это потому, что ASP.NET Core, ASP.NET MVC и ASP.NET WebForms, начиная с 2001 года, имеют довольно интересную особенность: когда ~/ используется правильно, это означает, что веб-приложение может «жить» в произвольном подкаталоге. (или даже глубже), в специальном виртуальном каталоге веб-сайта IIS, называемом областью приложения, который позволяет им сосуществовать с другими веб-приложениями, не наступая друг другу на пятки.

Это было важно еще в те давние времена, когда стандартная инфраструктура как код и развертывание новых виртуальных машин и контейнеров за считанные секунды было чем-то, что могла сделать только IBM Big Iron для устаревших банков.

Это до сих пор документировано в холодных и черновых разделах сайта документации Microsoft.


Например, давайте снова представим, что на дворе 2003 год, вы управляете ИТ-инфраструктурой небольшой компании, и у вас есть только один веб-сайт IIS для работы, но вам нужно разместить три отдельных веб-приложения ASP.NET: фотогалерею, какое-то приложение для внутренних финансов и несколько статических страниц.

Поскольку им нужен общий доступ к одному веб-сайту, вы решаете поместить их под /photos, /finance и / соответственно. Итак, вы открываете веб-пространство вашего веб-сайта (то есть его файловую систему) в C:\Inetpub\wwwroot\, выполняете mkdir photos && mkdir finance, а затем xcopy-развертываете эти файлы в этих подкаталогах, а затем настраиваете эти /photos и /finance каталоги как корень двух новых областей приложения в IIS. Менеджер.

... вот что означает значок шестеренки (вместо значка папки) в диспетчере IIS 6:

Теперь, поскольку приложение «Фотографии» и приложение «Финансы» являются веб-приложениями ASP.NET WebForms, это означает, что они оба имеют каталоги /bin, но каталог /bin обычно находится в корне веб-сайта - ну, нет: на самом деле посетители /bin находятся в корне области приложения. (а корень веб-сайта — это его собственная корневая область приложения), поэтому вместо того, чтобы /photos и /finance делиться C:\Inetpub\wwwroot\bin\, каждый из них получает свои собственные: C:\Inetpub\wwwroot\photos\bin и C:\Inetpub\wwwroot\finance\bin

... им не только не придется использовать общий каталог /bin, но они даже не будут совместно использовать один и тот же хост-процесс веб-сервера: отдельные приложения обычно настраиваются для запуска в разных процессах w3wp.exe поэтому если однажды произойдет сбой, это не приведет к сбою всего, что работает на том же веб-сайте.


Спасибо . Так что мне сейчас не нужно использовать «~/». Даже если я использую «/» и загружу его на сервер, у меня не возникнет никаких ошибок, будет ли это работать?

Karayeniceri 15.06.2024 18:39

@Karayeniceri Я рекомендую людям по-прежнему использовать ~/, потому что это означает, что ваши URI и пути по-прежнему будут каким-то образом проверяться ASP.NET (хотя я сейчас не могу придумать никаких примеров, извините). Вам это ничего не стоит :)

Dai 15.06.2024 18:43

@Karayeniceri Я только что расширил свой ответ более подробно.

Dai 15.06.2024 18:57

большое спасибо . Я пытаюсь понять :)

Karayeniceri 15.06.2024 19:45

Другие вопросы по теме

.NET Core, недопустимое состояние ModelState в навигационных свойствах AllowNull в простой модели продуктов и категорий
ASP.NET Core 8.0 MVC: лучшие практики для динамически создаваемых элементов управления из SQL
Проблема с оценкой данных в хранилище BLOB-объектов с использованием токенов OAuth из приложения dotnet
ASP.NET Core 8.0 MVC: проблема с кодировкой в ​​файлах js
Как полностью удалить регистрацию в ASP.NET Core 8.0 с помощью Entity Framework Core?
Настройки пересылки Yarp для динамической пересылки
Проверка модели ASP.NET Core 8 MVC — [Обязательно] и индикатор типа, допускающего значение NULL
Когда я нажимаю кнопку удаления, я получаю сообщение об ошибке и не нажимаю контроллер удаления в ASP.NET Core с Entity Framework Core
Ошибка проверки формы ASP.NET Core 6.0: «Поле fieldNameHere является обязательным». хотя такого поля не существует
Зачем менять первую букву свойства на строчную при обновлении проекта до .NET 8?