Мы храним кучу странных имен документов на нашем веб-сервере (люди загружают их), которые имеют различные символы, такие как пробелы, амперсанды и т. Д. Когда мы генерируем ссылки на эти документы, нам нужно экранировать их, чтобы сервер мог искатьфайл по его сырому имени в базе данных.Однако ни одна из встроенных escape-функций .NET не будет работать правильно во всех случаях.
Возьмите документ Hello#There.docx
:
UrlEncode
будет обрабатывать это правильно:
HttpUtility.UrlEncode("Hello#There");
"Hello%23There"
Однако UrlEncode
будет не обрабатывать Hello There.docx
правильно:
HttpUtility.UrlEncode("Hello There.docx");
"Hello+There.docx"
Символ +
действителен только для параметров URL, но не для имен документов.Интересно, что на самом деле это работает на тестовом веб-сервере Visual Studio, но не на IIS.
Функция UrlPathEncode
отлично работает для пробелов:
HttpUtility.UrlPathEncode("Hello There.docx");
"Hello%20There.docx"
Однако она не ускользнет от другихтакие символы, как #
:
HttpUtility.UrlPathEncode("Hello#There.docx");
"Hello#There.docx"
Эта ссылка недействительна, поскольку #
интерпретируется как хэш URL-адреса и даже не попадает на сервер.
Есть лиУтилита .NET, позволяющая экранировать все не алфавитно-цифровые символы в имени документа, или мне придется написать свой собственный?