IgnoreRoute с webservice-исключить URL-адреса asmx из маршрутизации
Im добавление filevistacontrol в мой asp.net веб-приложение MVC.
у меня есть СМИ.aspx-страницу, которая игнорируется в маршрутизации с
routes.IgnoreRoute("media.aspx");
это работает успешно и служит стандартной странице webforms.
при добавлении filevistacontrol я не могу игнорировать любые вызовы, которые элемент управления делает для его веб-службы.
например, следующий ignoreRoute по-прежнему, кажется, подобран MvcHandler.
routes.IgnoreRoute("FileVistaControl/filevista.asmx/GetLanguageFile/");
В исключение:
'The RouteData must contain an item named 'controller' with a non-empty string value'
спасибо заранее.
6 ответов
Я получил его для работы с помощью этого (комбо других ответов):
routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}");
короткий ответ:
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
сервис. Это ограничение может быть выражено с помощью regex следующим образом:.*\.asmx(/.*)?
. Это регулярное выражение соответствует любой строке, которая заканчивается .asmx
дополнительно сопровождаемый хозяином количество символов после него.
Итак, окончательный ответ таков:
routes.IgnoreRoute( "{*url}", new { url = @".*\.asmx(/.*)?" } );
что происходит при использовании:
routes.IgnoreRoute("FileVistaControl/filevista.asmx");
Если это не работает, попробуйте использовать ASP.NET отладчик маршрутизации: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx
попробуйте это:
routes.IgnoreRoute("{*filevista}", new { filevista = @"(.*/)?filevista.asmx(/.*)?" });
это основано на рекомендации Фила Хаака указано здесь.
вы пробовали:
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
это поможет, если вы разместили источник для конфигурации маршрута. Я собираюсь сделать снимок в темноте и сказать, чтобы убедиться, что ваши вызовы IgnoreRoute() находятся в верхней части вашего определения маршрутизации.
способ работы IgnoreRoute заключается в создании маршрута, который соответствует игнорируемому URL-адресу маршрута и ограничениям, и присоединяет StopRoutingHandler
Как RouteHandler. UrlRoutingModule знает, что StopRoutingHandler означает, что он не должен направлять запрос.
как мы знаем, маршруты согласованы в том порядке, в котором они определены. Итак, если ваш {controller}/{action}/{id}
маршрут появляется перед вашим "FileVistaControl/filevista.asmx/GetLanguageFile/"
маршрут, тогда он будет соответствовать "{controller}/{action}/{id}"
маршрут.
Я могу быть полностью вне базы здесь, но это трудно узнать, не видя ваш источник. Надеюсь, это поможет. И опубликовать исходный код! Ты получишь ответы получше.