在WebApiConfig.cs文件中,我有以下内容。
我已经尝试过。
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Services.Replace(typeof(IHttpControllerSelector),
new MyApiControllerSelector(config));
//code omitted for brevity
}
然后在MyApiControllerSelector.cs中,我想获得控制器。
public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
var routeData = request.GetRouteData();
var controllerName = (string)routeData.Values["controller"];
//code omitted for brevity
}
很简单并且效果很好,但现在使用属性路由,我认为需要采用不同的方法?因为我似乎找不到一个简单的方法。我已经尝试过。
var controllerName = request.GetActionDescriptor().ControllerDescriptor.ControllerName;
它不起作用。
然后我通过调试阅读源代码,找到了 request.GetRouteData().Values["MS_SubRoutes"]
现在我有了:
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;
这个方法可以工作,但是有没有更简单的方式呢?
更新
@KiranChalla 问了我的用例,所以我发布了剩余的代码。
基本上,我正在解析请求中的版本媒体类型Accept: application/vnd.app.{resource}.v{version}+json
,
并根据版本返回一个HttpControllerDescriptor。
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;
request.GetRouteData().GetSubRoutes()
来获取列表属性路由的一个小改进... - Kiran