IgnoreRoute с webservice - Исключить URL asmx из маршрутизации

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

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

routes.IgnoreRoute("media.aspx");

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

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

Например, следующий ignoreRoute все еще, кажется, получает MvcHandler.

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

Исключение составляет:

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

Спасибо заранее.

Ответ 1

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

routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}");

Ответ 2

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

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

Длинный ответ:

Если ваша служба может находиться на любом уровне пути, ни один из этих параметров не будет работать для всех возможных сервисов .asmx:

routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}");

По умолчанию параметры в шаблоне маршрута будут совпадать, пока не найдут косую черту.

Если параметр начинается со звезды *, например pathInfo в этих ответах, он будет соответствовать всем, включая слэши.

Итак:

  • первый ответ будет работать только для служб .asmx в корневом пути, becasuse {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(/.*)?" } );

Ответ 3

Что произойдет, если вы используете:

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

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

Ответ 4

Попробуйте следующее:

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

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

Ответ 5

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

routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");

Ответ 6

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

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

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

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