Использование перезаписи в сочетании с маршрутизацией URL-адресов ASP.NET не рекомендуется, поскольку некоторые реализации маршрутизации URL-адресов ASP.NET также используют внутреннюю перезапись (это зависит от версии ASP.NET).Комбинация двух разных компонентов с использованием перезаписи может вызвать конфликты (хотя я не уверен на 100%, что именно поэтому вы видите эту проблему).
Относительно использования переноса / перенаправления / перезаписи:
Моя самая сильная рекомендация - не использовать ни один из них!Вместо перенаправления (или чего-либо еще) просто позвольте странице вызываться непосредственно ASP.NET, возвращая ее из IRouteHandler, почти так же, как вы уже делаете (просто без вызова Rewrite).Пока ваш IRouteHandler
сохраняет RouteData
где-то, Страница может затем получать данные из маршрута, и вы должны быть в порядке.
Взгляните на Маршрутизация веб-формы Фила ХаакаПример , чтобы увидеть пример того, как сохранить данные маршрута (или просто использовать его код!).
Относительно игнорирования шаблонов:
Вы можете использовать IRouteConstraint, чтобы ограничить, какие URL соответствуютваш маршрут.Существует встроенная реализация ограничения маршрута по умолчанию, которая использует регулярные выражения, но вы также можете написать собственные ограничения маршрута.Вот пример:
Route r = new Route(...);
r.Constraints = new RouteValueDictionary(new {
campaign_code = "\d{5}", // constrain to 5-digit numbers only
other_value = new CustomRouteConstraint(), // call custom constraint
});
CustomRouteConstraint - это класс, который вы можете написать, который наследуется от IRouteConstraint
.
Одна вещь, которую я должен отметить о статических файлах, таких какпоскольку файлы CSS и JPG таковы, что по умолчанию они всегда исключаются из маршрутизации.По умолчанию маршрутизация игнорирует шаблоны, которые точно соответствуют физическим файлам на диске.Вы можете изменить это поведение, установив RouteTable.Routes.RouteExistingFiles = true
, но это не значение по умолчанию.