我有一个RouteCollection
和一个带有 URL 的字符串。有谁知道如何获得将要执行的路线的名称?
像这样的一些方法RouteCollection.PredictRoute(url)
将返回路由名称或将要执行的物理文件。
我想从 Web 服务器日志文件中创建一些统计信息。将 usedRouteCollection
用于该统计信息会非常好。
非常感谢!
我假设您想在 MVC 应用程序之外执行此操作,其中请求和上下文不可用(只有日志文件,如您所述)。
不幸的是,这并不容易做到。为了编写这样的匹配方法,您需要重用(或更糟糕的是,重写)用于 URL 解析的 MVC 框架代码,这些代码在 namespace 中的各种类中找到System.Web.Http.Routing
。源代码在CodePlex上可用,在 Apache 2.0 许可下。
相反,我认为有一种更简单的方法可以将路由名称包含在日志文件中,并稍后在统计信息中使用它们。看看下面。
您可以做的是扩展默认MvcHandler
类并覆盖其ProcessRequest
方法。在那里,您可以调用基类实现,然后使用RequestContext.RouteData
.
除其他内容外,该类RouteData
还包含当前路由(您在路由集合中定义。可通过RouteData.Route
属性访问。
这是因为MvcHandler
总是由 , 委派(除非您创建了自己的 MVC 基础架构)MvcRouteHandler
来处理每个请求的处理。它是从现有路由数据中获取控制器数据、实例化IController
实现并最终执行它的控制器。
这是我用来测试 URL 是否被映射到正确的控制器和操作的代码片段。您也应该能够检查路线名称。
RouteConfig.RegisterRoutes(routes);
RouteData routeData = routes.GetRouteData(context);
string controller = routeData.Values["controller"];
string action = routeData.Values["action"];
变量 routes 是一个 RouteCollection 对象,而 context 是一个 HttpContextBase 对象。