Маршрутизация 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 может быть любой строкой?

3 ответа

Решение

Хорошо, у меня есть окончательный ответ. Да, это ошибка. Тем не менее, в данный момент я с сожалением могу сказать, что у нас нет планов исправить это по нескольким причинам:

  • Это серьезное изменение, и его может быть очень трудно заметить.
  • Есть легкий обходной путь.

Что вы можете сделать, это изменить URL, чтобы не иметь подчеркивания:

{controller}/{action}/_{id}

Затем добавьте ограничение маршрута, которое требует, чтобы параметр ID начинался с символа подчеркивания.

Затем в вашем методе действия вы обрезаете префикс подчеркивания из параметра id. Вы можете даже написать фильтр действий, чтобы сделать это для вас, если хотите. Приносим извинения за неудобства.

Вы можете использовать символы, которые не разрешены для каталога или имени файла, например: *,?,:, ",<,>, |.

С ASP.NET MVC, если вы посмотрите на источник, у них есть жестко запрограммированное значение для разделителя пути (/), и, насколько мне известно, изменить нельзя.

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