【问题标题】:Web API get route valuesWeb API 获取路由值
【发布时间】:2013-05-07 19:44:52
【问题描述】:

有什么方法可以从在 Web API 上下文中运行的服务方法(控制器外部)静态获取路由值?例如,我可以在 ASP.NET MVC 中执行以下操作:

var mvcHandler = HttpContext.Current.Handler as MvcHandler;
var routeValues = mvcHandler.RequestContext.RouteData.Values;

我想为 Web API 找到此代码的等效版本。

当我尝试调试示例 Web API 请求并查看 HttpContext.Current.Handler 时,它的类型为 HttpControllerHandler,但此类型没有任何属性来访问路由数据。

编辑

尝试帮助提供更多信息。我试图从中读取值的代码位于我拥有的为我的应用程序构建自定义对象的工厂类中。

【问题讨论】:

  • Kyle,请您为我们发布代码的 Web API 版本吗?
  • 这就是我想要弄清楚的:)
  • 你的意思是你做了'使用 System.Web.Http; var handler = Http.Current.Handler' 发现是HttpControllerHandler?
  • 是的,这就是我发现的。
  • 您是否尝试过 Routes 对象上的 Routes 属性,或者这也不是正确的上下文

标签: asp.net-web-api asp.net-web-api-routing


【解决方案1】:

我找到了一个解决方案,可以获取 MVC 请求或 Web API 请求的路由值。

HttpContext.Current.Request.RequestContext.RouteData

【讨论】:

    【解决方案2】:

    您可以在 HttpRequestMessage 上使用 GetRouteData() 扩展。您需要包含 System.Net.Http 命名空间才能得到它。

    System.Web.Http.Routing.IHttpRouteData routeData = Request.GetRouteData();
    

    【讨论】:

    • 谢谢。看来这可以在控制器内工作,但在控制器之外 HttpContext.Current.Request 不是 HttpRequestMessage 类型(并且不能转换为它)。我应该在 OP 中更好地澄清这一点。
    • 不,您可以在任何可以访问 HttpRequestMessage 的地方访问它。消息处理程序中的示例:'public class DelegateHandlerA: DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancelToken) { System.Web.Http.Routing.IHttpRouteData routeData = request.GetRouteData(); HttpResponseMessage 响应 = 等待 base.SendAsync(request, cancelToken);返回响应; } }'
    • 顺便说一句,GetRouteData() 扩展也会在 WebHost(IIS) 和 SelfHost(其中 HttpContext 不可用)场景中提供一致的体验。
    • @PeteKlein 不,我做不到。我的工厂类无权访问 HttpRequestMessage。我同意这是比我建议的更清洁的方法,但我无法让它按照我想要的方式工作。
    • 能否请您解释一下为什么不避免使用 ApiController?
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多