的ASP.NET Web API 2属性的路由控制器名称 [英] ASP.NET Web API 2 Attribute routing controller name

查看:219
本文介绍了的ASP.NET Web API 2属性的路由控制器名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在WebApiConfig.cs我有以下

 公共静态无效的注册(HttpConfiguration配置)
{   config.MapHttpAttributeRoutes();   config.Services.Replace(typeof运算(IHttpControllerSelector)
               新MyApiControllerSelector(配置));   // code不再赘述
}

然后在 MyApiControllerSelector.cs 我想获得该控制器

 公众覆盖HttpControllerDescriptor SelectController(HTT prequestMessage要求)
        {
            变种的RouteData = request.GetRouteData();            VAR controllerName =(字符串)routeData.Values​​ [控制器];            // code不再赘述
        }

pretty简单,它的工作很好,但现在用的属性路由我觉得需要一种不同的方法? - 因为我似乎无法找到一个简单的方法

我试过

  VAR controllerName = request.GetActionDescriptor()ControllerDescriptor.ControllerName。

这是行不通的。

然后读<一个href=\"http://aspnetwebstack.$c$cplex.com/SourceControl/latest#src/System.Web.Http/Htt$p$pquestMessageExtensions.cs\">source调试导致我 request.GetRouteData()。值[MS_SubRoutes]

所以现在我有

 字符串subRoutesKey =MS_SubRoutes;VAR attributedRoutesData = routeData.Values​​ [subRoutesKey]为IEnumerable&LT; IHttpRouteData取代;
变种subRouteData = attributedRoutesData.FirstOrDefault();VAR行动=(ReflectedHttpActionDescriptor [])subRouteData.Route.DataTokens [行动];
变种controllerName =行动[0] .ControllerDescriptor.ControllerName;

这工作,但它必须是一个简单的方法?

更新

@KiranChalla问什么所以我张贴剩余code我的用例。
基本上我解析版本的媒体类型接受:应用/ vnd.app {}资源{.V版本} + JSON 从请求并返回一个 HttpControllerDescriptor 根据不同的版本。

  HttpControllerDescriptor oldControllerDescriptor;
            如果(controllers.TryGetValue(controllerName,出oldControllerDescriptor))
            {
                VAR apiVersion = GetVersionFromMediaType(请求);                变种newControllerName = String.Concat(controllerName,V,apiVersion);                HttpControllerDescriptor newControllerDescriptor;
                如果(controllers.TryGetValue(newControllerName,出newControllerDescriptor))
                {
                    返回newControllerDescriptor;
                }
                返回oldControllerDescriptor;
            }
            返回null;


解决方案

随着证实@KiranChalla有没有更简单的方法,我已经已经实施的人,除了轻微的建议,使用 GetSubRoutes( )

  VAR attributedRoutesData = request.GetRouteData()GetSubRoutes()。
变种subRouteData = attributedRoutesData.FirstOrDefault();VAR行动=(ReflectedHttpActionDescriptor [])subRouteData.Route.DataTokens [行动];
变种controllerName =行动[0] .ControllerDescriptor.ControllerName;

In WebApiConfig.cs i have the following

public static void Register(HttpConfiguration config)
{

   config.MapHttpAttributeRoutes(); 

   config.Services.Replace(typeof(IHttpControllerSelector),
               new MyApiControllerSelector(config));

   //code omitted for brevity
}

then in the MyApiControllerSelector.cs i want to get the controller

public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {           
            var routeData = request.GetRouteData();           

            var controllerName = (string)routeData.Values["controller"];

            //code omitted for brevity
        }

Pretty simple and it worked great but now using attribute routing i think it needs a different approach? - as i can't seem to find a simple way

I've tried

var controllerName = request.GetActionDescriptor().ControllerDescriptor.ControllerName;

which doesn't work.

Then reading the source with debugging lead me to request.GetRouteData().Values["MS_SubRoutes"]

So now I have

string subRoutesKey = "MS_SubRoutes";

var attributedRoutesData = routeData.Values[subRoutesKey] as IEnumerable<IHttpRouteData>; 
var subRouteData = attributedRoutesData.FirstOrDefault();

var actions = (ReflectedHttpActionDescriptor[])subRouteData.Route.DataTokens["actions"];
var controllerName = actions[0].ControllerDescriptor.ControllerName;

which works but it has to be a simpler way?

UPDATE

@KiranChalla asked what's my use case so i'm posting the remaining code. Basically i'm parsing version media type Accept: application/vnd.app.{resource}.v{version}+json from request and returning a HttpControllerDescriptor depending on the version.

            HttpControllerDescriptor oldControllerDescriptor;
            if (controllers.TryGetValue(controllerName, out oldControllerDescriptor))
            {
                var apiVersion = GetVersionFromMediaType(request);

                var newControllerName = String.Concat(controllerName, "V", apiVersion);

                HttpControllerDescriptor newControllerDescriptor;
                if (controllers.TryGetValue(newControllerName, out newControllerDescriptor))
                {                    
                    return newControllerDescriptor;
                }               
                return oldControllerDescriptor;
            }
            return null;

解决方案

As confirmed by @KiranChalla there is no simpler way then the one I've already implemented, except the minor suggestion to use GetSubRoutes()

var attributedRoutesData = request.GetRouteData().GetSubRoutes();
var subRouteData = attributedRoutesData.FirstOrDefault();

var actions = (ReflectedHttpActionDescriptor[])subRouteData.Route.DataTokens["actions"];
var controllerName = actions[0].ControllerDescriptor.ControllerName;

这篇关于的ASP.NET Web API 2属性的路由控制器名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆