IgnoreRoute with webservice - 从路由中排除asmx URL

时间:2011-01-12 23:48:55

标签: asp.net asp.net-mvc web-services routing asmx

我将filevistacontrol添加到我的asp.net MVC Web应用程序。

我有一个在使用

的路由中忽略的media.aspx页面
routes.IgnoreRoute("media.aspx");

这可以成功运行并提供标准的网页表单页面。

添加filevistacontrol后,我似乎无法忽略控件对其web服务的任何调用。

例如,以下ignoreRoute似乎仍被MvcHandler接收。

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

抛出的异常是:

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

提前致谢。

6 个答案:

答案 0 :(得分:12)

简短回答:

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(/.*)?" } );

答案 1 :(得分:8)

我使用它(其他答案的组合)让它工作:

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

答案 2 :(得分:2)

使用时会发生什么:

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

如果这不起作用,请尝试使用ASP.NET路由调试器来帮助您: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

答案 3 :(得分:2)

试试这个:

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

这是基于Phil Haack的建议here

答案 4 :(得分:1)

你试过了吗?

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

答案 5 :(得分:0)

如果您发布了路由配置的来源,这将有所帮助。我将在黑暗中拍摄并说出确保你的IgnoreRoute()调用都在你的路由定义的顶部。

IgnoreRoute的工作方式是创建一个匹配忽略的路由URL和约束的路由,并附加一个StopRoutingHandler作为RouteHandler。 UrlRoutingModule知道StopRoutingHandler意味着它不应该路由请求。

众所周知,路线按照定义的顺序进行匹配。因此,如果您的{controller}/{action}/{id}路线出现在"FileVistaControl/filevista.asmx/GetLanguageFile/"路线之前,那么它将与"{controller}/{action}/{id}"路线相匹配。

我可能完全不在这里,但是如果没有看到你的来源就很难知道。希望这可以帮助。并发布源代码!你会得到更好的答案。