ASP.Net Core Возвращает 404, когда URL-адреса изображения кодируются как + - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть URL-адреса, хранящиеся в базе данных, где пробелы кодируются как +. Когда браузер запрашивает эти URL-адреса, веб-сервер возвращает ответ 404. Все эти URL-адреса предназначены для статических изображений, хранящихся на веб-сервере в папке wwwroot. Если я вручную изменю + на %20, изображение вернется правильно.

Это преднамеренное изменение в ASP.Net Core или это ошибка? Если это умышленно, мне будет очень больно просматривать базу данных и перекодировать все URL-адреса, многие из которых встроены в фрагменты HTML (я знаю, что хранить HTML в БД или иметь пробелы в файлах изображений не хорошая идея, но она была сделана задолго до того, как я присоединился к компании, и это состояние, в котором мы уже находимся).

Я использую ASP.Net 2.1, работающий на .Net Framework. В данный момент он работает через IIS Express (в процессе разработки), но будет развернут с полным IIS.

Я видел этот другой вопрос, но он определенно связан с вызовами API, и кажется, что ответ не применим к моему вопросу, поскольку нет маршрутов для изменения, поскольку я запрашиваю статическое изображение файлы.

Редактировать: дополнительные детали HTML выводится с использованием @Html.Raw(html) Результирующий вывод html в браузер имеет вид <img src="/BorderThemes/grey+4px+rounded+corners_TL.png" />

HTML был сгенерирован на сервере, а затем сохранен в БД, поэтому мы можем быть уверены, что его можно безопасно выводить в браузер, и, нет, я понятия не имею, почему кто-то сделал бы это вместо создания HTML, когда это необходимо, но это было до моего времени, и это ситуация, в которой я уже нахожусь.

Обновление: Я углубился в это, и если я ввожу http://localhost:8000/BorderThemes/grey+4px+rounded+corners_TL.png в свой веб-браузер, я получаю страницу от IIS с сообщением Http Error 404.11, в котором говорится, что мой URL-адрес имеет двойную кодировку, и для получения дополнительной информации ссылка на здесь . Это включает в себя инструкции о том, как разрешить двойное кодирование, но с предупреждениями о том, что это может иметь последствия для безопасности. Если я введу URL http://localhost:8000/BorderThemes/grey%204px%20rounded%20corners_TL.png, я получу изображение обратно.

У меня были проблемы с paths / html, хранящимися в БД, но после эксперимента оказалось, что System.Net.WebUtility.UrlEncode кодирует пробелы как +. Например, WebUtility.UrlEncode("foo bar.png") возвращает foo+bar.png, который отклоняется в IIS с двойным кодированием.

Я что-то упустил или функция Microsoft для кодирования URL-адресов, кодирующая URL-адреса таким способом, который веб-сервер Microsoft отклоняет?

1 Ответ

0 голосов
/ 12 сентября 2018

Если вы хотите, чтобы %20 вместо + попытался использовать EscapeDataString для кодирования URI:

Uri.EscapeDataString(someString);

См. https://stackoverflow.com/a/50682381/704008

Но вы уже сгенерировали URL & можете 'Сейчас мы делаем что-нибудь, поэтому попробуйте использовать HtmlDecode, например

System.Net.WebUtility.HtmlDecode.HtmlDecode(html);

. Я не уверен, что лучше использовать с Raw, или существует какой-либо метод, например decode в @Html, но попробуйте использовать:

@Html.Raw(System.Net.WebUtility.HtmlDecode(html))

См .: https://docs.microsoft.com/en-us/dotnet/api/system.net.webutility?view=netstandard-2.0

https://docs.microsoft.com/en-us/dotnet/api/system.net.webutility.urldecode?view=netstandard-2.0#System_Net_WebUtility_UrlDecode_System_String_

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