0

我正在使用自定义入站URL路由“玩”,并遇到了问题。ASP.NET MVC5定制入站路由

当我将自定义路由传递给一个要检查的URL时,以*。+结尾,当我提交请求时,我的类不会被触发。

一个例子URL是“〜/老/ windows.html”

当我通过这个在调试步骤,我RouteBase执行不火。如果我编辑我传递给我的路由的构造函数的url以尝试匹配“〜/ old/windows”,我的实现将按预期启动。

再说一遍,如果我将URL更改为“〜/ old/windows”。问题再次出现。

我的路线实现如下: -

public class LegacyRoute : RouteBase 
    { 
     private string[] _urls; 

     public LegacyRoute(string[] targetUrls) 
     { 
      _urls = targetUrls; 
     } 

     public override RouteData GetRouteData(HttpContextBase httpContext) 
     { 
      RouteData result = null; 

      string requestedURL = httpContext.Request.AppRelativeCurrentExecutionFilePath; 

      if (_urls.Contains(requestedURL, StringComparer.OrdinalIgnoreCase)) 
      { 
       result = new RouteData(this, new MvcRouteHandler()); 
       result.Values.Add("controller", "Legacy"); 
       result.Values.Add("action","GetLegacyURL"); 
       result.Values.Add("legacyURL", requestedURL); 

      } 

      return result; 
     } 

     public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
     { 
      return null; 
     } 
    } 

在我已经注册了,像这样我的路线RoutesConfig文件: -

routes.MapMvcAttributeRoutes(); 

routes.Add(new LegacyRoute(new[]{"~/articles/windows.html","~/old/.Net_1.0_Class_Library"})); 

任何人都可以指出为什么有问题?

回答

1

默认情况下,.html扩展名不由.NET处理,它由IIS直接处理。

<handlers> 
    <add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
</handlers> 

正如指出的here - 您可以通过<system.webServer>下加入Web.config中的以下部分覆盖。上述操作会将每个.html文件请求路由到.NET,如果您不希望路由处理每个.html文件,则可以通过提供更完整的路径来更具体地指定。

1

我发现了这个问题,我相信这会帮助很多开发人员。

问题在于通过Visual Studio运行的IIS Express。

有一个在对ApplicationHost.config配置模块调用: -

UrlRoutingModule-4.0

这是它的外观在文件: -

<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler,runtimeVersionv4.0" /> 

您需要设置“”的参数preCondition参数。在系统托盘通过Visual Studio中的应用程序

  • 运行你
  • 右键点击IIS Express中,选择“显示所有的应用程序”
  • 单击要到项目 - :

    要做到这一点编辑,然后点击配置URL。

  • 用Visual Studio打开文件,找到模块并修改。

希望这可以帮助任何遇到类似问题的人。