ASP.NET маршрутизация: буквенный подсегмент между токенами и значения маршрута с символом из буквального подсегмента - PullRequest
12 голосов
/ 30 ноября 2010

Причина, по которой я спрашиваю, заключается в том, что 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

Но эти маршруты не будут работать, если идентификатор содержит новыйdelimeter, _ в данном случае, например

// These URL won't work (I get 404 response)
Catalog/Product_Bin_
Catalog/Product/_Bin_
Catalog/Product/__Bin

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

Ответы [ 3 ]

7 голосов
/ 19 сентября 2011

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

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

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

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

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

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

0 голосов
/ 21 апреля 2011

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

0 голосов
/ 21 апреля 2011

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

...