IgnoreRoute с веб-сервисом - исключить asmx URL из маршрутизации - PullRequest
11 голосов
/ 13 января 2011

Я добавляю filevistacontrol в мое веб-приложение asp.net MVC.

У меня есть страница media.aspx, которая игнорируется при маршрутизации с

routes.IgnoreRoute("media.aspx");

Это успешно работает и обслуживает стандартную страницу веб-форм.

После добавления filevistacontrol я не могу игнорировать любые вызовы, которые элемент управления делает для своего веб-сервиса.

Например, MvcHandler по-прежнему обнаруживает следующее ignoreRoute.

routes.IgnoreRoute("FileVistaControl/filevista.asmx/GetLanguageFile/");

Исключение:

'The RouteData must contain an item named 'controller' with a non-empty string value'

Заранее спасибо.

Ответы [ 6 ]

12 голосов
/ 11 апреля 2013

Краткий ответ:

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(/.*)?" } );
8 голосов
/ 03 мая 2011

Я заставил его работать, используя это (комбинация других ответов):

routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}");
2 голосов
/ 24 января 2011

Попробуйте это:

routes.IgnoreRoute("{*filevista}", new { filevista = @"(.*/)?filevista.asmx(/.*)?" }); 

Это основано на рекомендации Фила Хаака, заявленной здесь .

2 голосов
/ 20 января 2011

Что происходит при использовании:

routes.IgnoreRoute("FileVistaControl/filevista.asmx");

Если это не сработает, попробуйте использовать отладчик маршрутизации ASP.NET, чтобы помочь вам: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

1 голос
/ 13 января 2011

Вы пробовали:

routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
0 голосов
/ 26 января 2011

Было бы полезно, если бы вы опубликовали исходный код для конфигурации вашего маршрута.Я собираюсь сделать снимок в темноте и сказать, чтобы убедиться, что все ваши вызовы IgnoreRoute () находятся на вершине вашего определения маршрутизации.

Способ работы IgnoreRoute - создать маршрут, который соответствуетигнорирует URL-адрес и ограничения маршрута и присоединяет StopRoutingHandler в качестве RouteHandler.UrlRoutingModule знает, что StopRoutingHandler означает, что он не должен направлять запрос.

Как мы знаем, маршруты сопоставляются в том порядке, в котором они определены.Таким образом, если ваш маршрут {controller}/{action}/{id} появляется перед вашим маршрутом "FileVistaControl/filevista.asmx/GetLanguageFile/", он будет соответствовать маршруту "{controller}/{action}/{id}".

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

...