2

我有一个RouteCollection和一个带有 URL 的字符串。有谁知道如何获得将要执行的路线的名称?

像这样的一些方法RouteCollection.PredictRoute(url)将返回路由名称或将要执行的物理文件。

我想从 Web 服务器日志文件中创建一些统计信息。将 usedRouteCollection用于该统计信息会非常好。

非常感谢!

4

2 回答 2

0

我假设您想在 MVC 应用程序之外执行此操作,其中请求和上下文不可用(只有日志文件,如您所述)。

不幸的是,这并不容易做到。为了编写这样的匹配方法,您需要重用(或更糟糕的是,重写)用于 URL 解析的 MVC 框架代码,这些代码在 namespace 中的各种类中找到System.Web.Http.Routing。源代码在CodePlex上可用,在 Apache 2.0 许可下。

相反,我认为有一种更简单的方法可以将路由名称包含在日志文件中,并稍后在统计信息中使用它们。看看下面。

您可以做的是扩展默认MvcHandler类并覆盖其ProcessRequest方法。在那里,您可以调用基类实现,然后使用RequestContext.RouteData.

除其他内容外,该类RouteData还包含当前路由(您在路由集合中定义。可通过RouteData.Route属性访问。

这是因为MvcHandler总是由 , 委派(除非您创建了自己的 MVC 基础架构)MvcRouteHandler来处理每个请求的处理。它是从现有路由数据中获取控制器数据、实例化IController实现并最终执行它的控制器。

于 2013-05-26T18:51:43.523 回答
0

这是我用来测试 URL 是否被映射到正确的控制器和操作的代码片段。您也应该能够检查路线名称。

RouteConfig.RegisterRoutes(routes);
RouteData routeData = routes.GetRouteData(context);
string controller = routeData.Values["controller"];
string action = routeData.Values["action"];

变量 routes 是一个 RouteCollection 对象,而 context 是一个 HttpContextBase 对象。

于 2013-05-26T19:08:05.720 回答