gpt4 book ai didi

c# - 获取 Controller 名称

转载 作者:太空狗 更新时间:2023-10-29 17:44:48 24 4
gpt4 key购买 nike

在 WebApiConfig.cs 中我有以下内容

public static void Register(HttpConfiguration config)
{

config.MapHttpAttributeRoutes();

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

//code omitted for brevity
}

然后在 MyApiControllerSelector.cs 我想获取 Controller

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;

这是行不通的。

然后读取 source通过调试将我带到 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;

最佳答案

正如@KiranChalla 所证实的那样,除了使用 GetSubRoutes()

的小建议外,没有比我已经实现的方法更简单的方法了
var attributedRoutesData = request.GetRouteData().GetSubRoutes();
var subRouteData = attributedRoutesData.FirstOrDefault();

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

关于c# - 获取 Controller 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19545898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com