我将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'
提前致谢。
答案 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}"
路线相匹配。
我可能完全不在这里,但是如果没有看到你的来源就很难知道。希望这可以帮助。并发布源代码!你会得到更好的答案。