是否可以在控制器外部获取运行时的路线数据?

2024-04-27

我想知道是否有可能以某种方式获取控制器外部的路由值?

这是我尝试过的。我也尝试过做.Values["{projectId}"];但我仍然得到null.

[RoutePrefix("projects")]
public class UsergroupController : ApiController
{
    [Route("{projectId}/usergroups"), HttpGet]
    public IHttpActionResult Get()
    {
        // Url: /projects/123/usergroups
        // Response: null
        var projectId = HttpContext.Current.Request.RequestContext.RouteData.Values["projectId"];
        return Ok(projectId);
    }
}

我发现它位于,但是位于一个非常奇怪的地方。也许可能有某种 LINQ 查询来获取它?

RouteData-值-值-0-0-值-0


WebApi 有它自己的嵌套 RouteData,这是因为它不使用RouteData上课于System.Web但它是自己的HttpRouteData class.

Web Api 路由在 key 下添加一个条目MS_SubRoutes,Web Api 将其用于其内部路由。

我编写了一个扩展方法,它将 WebApi 路由数据扁平化为string/object字典,您可能会在其中看到RouteData.Values

WebApiExtensions.cs

public static class WebApiExtensions
{
    public static IDictionary<string, object> GetWebApiRouteData(this RouteData routeData)
    {
        if (!routeData.Values.ContainsKey("MS_SubRoutes"))
            return new Dictionary<string,object>();

        return ((IHttpRouteData[])routeData.Values["MS_SubRoutes"]).SelectMany(x => x.Values).ToDictionary(x => x.Key, y => y.Value);
    }
}

Usage:

[RoutePrefix("projects")]
public class UsergroupController : ApiController
{
    [Route("{projectId}/usergroups"), HttpGet]
    public IHttpActionResult Get()
    {
        // Url: /projects/123/usergroups
        // Response: null
        object value = null;

        var webApiRouteData = HttpContext.Current.Request.RequestContext.RouteData.GetWebApiRouteData();
        value = webApiRouteData["projectId"];

        return Ok(value);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在控制器外部获取运行时的路线数据? 的相关文章

随机推荐