C# ASP.NET MVC路由处理拼写错误的URL?

C# ASP.NET MVC路由处理拼写错误的URL?,c#,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc Routing,我们如何创建一个路由来检测URL是否与路由匹配,但该路由的参数是否错误 我最近遇到过几个案例,其中一个用户输入了错误的URL,并且很难进行调试,因为路由表不能很好地处理这些拼写错误: 此路由处理URL/Widgets/guid routes.MapRestfulRoute( "WidgetsItem", "Widgets/{idString}", new { controller = "Widgets", action = "Item" }, new { idSt

我们如何创建一个路由来检测URL是否与路由匹配,但该路由的参数是否错误

我最近遇到过几个案例,其中一个用户输入了错误的URL,并且很难进行调试,因为路由表不能很好地处理这些拼写错误:

此路由处理URL/Widgets/guid

routes.MapRestfulRoute(
    "WidgetsItem",
    "Widgets/{idString}",
    new { controller = "Widgets", action = "Item" },
    new { idString = 
    @"^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$"}
);

routes.MapRoute("WidgetsList", "Widgets", new { controller = "Widgets", action = "List" });
routes.MapRestfulRoute("CatchAll","{*url}", new {controller = "Error", action = "Http404"});
用户输入了URL/Widgets/25246810-4b60-4db8-8567-8db8826,看起来正确,但不正确(提供的guid中只有28个字符)

因为URL与路由不匹配,所以响应为404。但这是骗人的,并导致了调试问题:看起来小部件/项操作返回404。我们花了几个小时试图找出这个动作的错误,而实际上这个动作甚至没有被调用。直到我安装了RoutedBugger,我才注意到guid的格式不正确

我们如何创建另一个错误路由来检测URL是否确实与路由匹配,但该路由的参数是错误的

编辑:我可以通过添加与/Widgets/任何内容匹配的新路由,并将该路由置于正常路由之后来“修复”它:

routes.MapRestfulRoute(
    "WidgetsItemError",
    "Widgets/{idString}",
    new { controller = "Widgets", action = "Item" },
    new { idString = @"^.+$" } // match if it has any param at all
);

但这似乎是非常低效的-我将不得不为每个单独的路由添加一个类似的错误路由,例如/Foo、/Bar/FooBar等等(我有很多路由)。有没有更通用的方法可以做到这一点?

最简单的解决方案是删除路由约束,然后检查控制器中的空参数,并从该点开始执行任何操作。

当我处理路由中的guid时,我会接受一个字符串,尝试将字符串值解析为guid,如果它没有解析,我将返回一个不同的视图,并显示一条消息,指示id无效,然后重试


在这里,您唯一需要更改的是删除路由约束,并将您的操作更改为接受字符串而不是guid(除非您的操作已经接受字符串)

或者在它之后立即添加另一个路由,但不包括约束,然后转到其他操作。这样你就可以把逻辑分开了。@bhamlin-好的观点。之后的第二个路由只有在第一个路由失败时才会捕获。已经有第二个路由没有参数,如上图所示:Widgets/guid加载该项,而/Widgets(无参数)加载listYes,JK,但我指的是有参数但没有约束的路由。只有在存在无效参数时才会出现这种情况。请注意,路由约束可能会影响应用程序的性能。是否有任何指向讨论的链接来支持这种情况?如何创建一个没有约束的路由,然后仍然能够区分/Widgets/guid(返回一项)和/Widgets(返回列表)为什么让用户手动输入guid?这很容易出错。@Rick.Anderson-at-Microsoft.com这是一个REST API,他们必须提供他们发布的项目的ID。一个用户编写了他的api客户端来发送28个字符的guid,路由没有给出足够清晰的错误(404而不是“错误的guid格式”),是的,它实际上已经是操作的字符串参数,并且它已经进行了检查以确保字符串是有效的guid。但由于路线的原因,它从未投入行动。我只是改变了路线来接受任何字符串,没有问题了。很高兴我能帮上忙。如果这有助于您解决问题,请务必将其标记为已接受的答案,谢谢