Маршрутизация ASP.NET: литеральный подсегмент между токенами и значениями маршрута с символом из литерального подсегмента
Причина, по которой я спрашиваю, заключается в том, что IIS защищает определенные папки ASP.NET, такие как Bin, App_Data, App_Code и т.д. Даже если URL-адрес не сопоставляется с фактической папкой файловой системы, IIS отклоняет URL-адрес с сегментом пути равным к одному из названных имен.
Это означает, что у меня не может быть такого маршрута:
{controller}/{action}/{id}
... где id может быть любой строкой, например.
Catalog/Product/Bin
Итак, вместо отключения этой меры безопасности я готов изменить маршрут, используя суффикс перед идентификатором, например:
{controller}/{action}_{id} // e.g. Catalog/Product_Bin
{controller}/{action}/_{id} // e.g. Catalog/Product/_Bin
Но эти маршруты не будут работать, если идентификатор содержит новый делитель, _ в этом случае, например,
// These URL won't work (I get 404 response)
Catalog/Product_Bin_
Catalog/Product/_Bin_
Catalog/Product/__Bin
Почему? Я не знаю, похоже на ошибку. Как я могу заставить эти маршруты работать, где id может быть любой строкой?
Ответы
Ответ 1
Хорошо, у меня есть окончательный ответ. Да, это ошибка. Однако на данный момент я сожалею, что у нас нет планов исправить это по двум причинам:
- Это потрясающее изменение и может быть очень сложно заметить.
- Там есть простой способ обхода.
Что вы можете сделать, это изменить URL-адрес, чтобы не было подчеркивания:
{controller}/{action}/_{id}
Затем добавьте ограничение маршрута, требующее, чтобы параметр ID начинался с символа подчеркивания.
Затем в рамках вашего действия вы обрезаете префикс подчеркивания из параметра id. Вы могли бы даже написать фильтр действий, чтобы сделать это для вас, если хотите. Извините за неудобства.
Ответ 2
Вы можете использовать символы, которые не разрешены для каталога или имени файла, например: *,?,:, ", <, > , |.
Ответ 3
С ASP.NET MVC, если вы посмотрите на источник, у них есть твердое значение для разделителя путей (/), и, насколько мне известно, изменить нельзя.