【问题标题】:IgnoreRoute with webservice - Exclude asmx URLs from routingIgnoreRoute with webservice - 从路由中排除 asmx URL
【发布时间】:2011-01-12 23:48:55
【问题描述】:

我正在将 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'

提前致谢。

【问题讨论】:

  • 你使用的是什么版本的 MVC?

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


【解决方案1】:

简答:

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

【讨论】:

  • 我知道这个答案的发布时间比现在更接近 T-Rex 追踪地球的时间,但它为我指明了正确的方向,所以我给了它一个赞成票。这应该是公认的答案,但生活就是这样。令人难以置信的是,我正在寻找这个,因为我正在尝试将 MVC 添加到一个旧的 WebForms/WebServices 应用程序中......这是在你发布这个之后的几年 写的,所以真的一开始就应该是 MVC 或其他东西... sigh.
【解决方案2】:

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

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

【讨论】:

  • 相信我:如果 Web 服务位于应用程序的根目录中,这将失败。我的回答解释了它为什么会失败,以及如何让它工作。
【解决方案3】:

使用时会发生什么:

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

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

【讨论】:

  • 现在有比这个路由调试器更好的东西:Glimpse,它可以作为 Nuget 包下载,并且允许以较少干扰的方式调试比路由更多的东西。
【解决方案4】:

试试这个:

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

这是基于 Phil Haack 的建议 here

【讨论】:

    【解决方案5】:

    你试过了吗:

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

    【讨论】:

    • 嘿,谢谢你的回复,是的,我都试过了。我似乎可以让路由匹配我的 URL。我尝试为给定的 URL 添加路由并分配一个引发异常但似乎没有得到处理的处理程序。我认为这与它是一个物理文件有关。
    【解决方案6】:

    如果您发布了路线配置的源代码,将会有所帮助。我将在黑暗中试一试,确保您的 IgnoreRoute() 调用都位于路由定义的顶部。

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

    我们知道,路由是按照它们定义的顺序匹配的。因此,如果您的 {controller}/{action}/{id} 路由出现在您的 "FileVistaControl/filevista.asmx/GetLanguageFile/" 路由之前,那么它将匹配 "{controller}/{action}/{id}" 路由。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2018-02-19
      • 2011-03-10
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多