Маршрутизация 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, если вы посмотрите на источник, у них есть твердое значение для разделителя путей (/), и, насколько мне известно, изменить нельзя.