ASP.NET MVC5 自定义入站路由

ASP.NET MVC5 Customised Inbound Routing

我正在"玩"自定义入站 URL 路由,但遇到了问题。

当我将自定义路由传递给要检查的 URL 时,该 URL 以 *. ,当我提交请求时,我的课程没有被解雇。

示例 URL 为"~/old/windows.html"

当我在调试器中逐步执行此操作时,我的 RouteBase 实现不会触发。如果我编辑传递给路由构造函数的 url 以尝试匹配"~/old/windows",我的实现将按预期触发。

再次,如果我将 url ro 检查更改为"~/old/windows"。问题再次出现。

我的路线实现如下:-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 文件中,我已经像这样注册了我的路线:-

1
2
3
 routes.MapMvcAttributeRoutes();

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

谁能指出为什么会出现问题?


我已经找到了问题所在,我相信这会帮助很多开发人员。

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

在 applicationhost.config 中配置了一个名为 :-

的模块

UrlRoutingModule-4.0

这是它在文件中的样子:-

1
 

您需要将 preCondition 参数设置为 ".

要做到这一点:-

  • 通过 Visual Studio 运行您的应用程序
  • 右键单击系统托盘中的 IIS Express,选择"显示所有应用程序"
  • 单击您要编辑的项目,然后单击配置 URL。
  • 使用 Visual Studio 打开文件,找到模块并修改。

希望这对遇到类似问题的其他人有所帮助。


默认情况下,.html 扩展名不由 .NET 处理,而是由 IIS 直接处理。您可以通过在 <system.webServer> -

下的 Web.config 中添加以下部分来覆盖

1
2
3
<handlers>
 
</handlers>

正如这里指出的那样。以上将每个 .html 文件请求路由到 .NET,如果您不希望路由处理每个 .html 文件,您可能希望通过提供更完整的路径来更具体。