Краткий ответ:
routes.IgnoreRoute( "{*url}", new { url = @".*\.asmx(/.*)?" } );
Длинный ответ:
Если ваша служба может находиться на любом уровне пути, , ни одна из этих опций не будет работать для всех возможных служб .asmx :
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}");
По умолчанию параметры в шаблоне маршрута будут совпадать, пока они не найдут косую черту.
Если параметр начинается со звезды *
, например pathInfo
в этих ответах, он будет соответствовать всему, включая косую черту.
Итак:
- первый ответ будет работать только для
.asmx
сервисов в корневом пути, поскольку {resource}
не будет совпадать с косой чертой. (Будет работать для чего-то вроде http://example.com/weather.asmx/forecast
)
- второй будет работать только для
.asmx
сервисов, которые находятся на один уровень от корня. {directory}
будет соответствовать первому сегменту пути, а {resource}
- имени сервиса. (Будет работать для чего-то вроде http://example.com/services/weather.asmx/forecast
)
Никто не будет работать для http://example.com/services/weather/weather.asmx/forecast
)
Решение использует другую перегрузку метода IgnoreRoute
, которая позволяет указывать ограничения. Используя это решение, вы можете использовать простой шаблон, который соответствует всем URL-адресам, например: {*url}
. Тогда вам нужно только установить ограничение, которое проверяет, что этот URL ссылается на сервис .asmx
. Это ограничение может быть выражено с помощью регулярного выражения: .*\.asmx(/.*)?
. Это регулярное выражение совпадает с любой строкой, которая заканчивается .asmx
, за которым, возможно, следует косая черта и любое количество символов после него.
Итак, окончательный ответ таков:
routes.IgnoreRoute( "{*url}", new { url = @".*\.asmx(/.*)?" } );