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}" маршрут.

Я могу быть полностью вне базы здесь, но это трудно узнать, не видя ваш источник. Надеюсь, это поможет. И опубликовать исходный код! Ты получишь ответы получше.