Ответ 1
Я использовал его для работы (комбо других ответов):
routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}");
Я добавляю 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'
Спасибо заранее.
Я использовал его для работы (комбо других ответов):
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
в корневом пути, 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(/.*)?" } );
Что произойдет, если вы используете:
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}"
.
Я, возможно, полностью отсюда, но это трудно понять, не видя вашего источника. Надеюсь это поможет. И отправьте исходный код! Вы получите лучшие ответы.