使用路由属性进行 Web API 版本控制时如何获取控制器名称

2024-01-10

我需要从我的路由中获取控制器名称,如果在 WebApiConfig 中使用标准路由代码,我可以做到这一点。

但是,如果我使用路由属性,它就会开始变得有点困难,尤其是在尝试版本控制时。

示例:如果我调用 api/terms/bonuses,并且我有 BonusController、BonusV2Controller 和 BonusV3Controller,则此代码将返回最新的控制器版本 3。没关系,我可以接受默认返回最新和最好的版本。

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

var actions = (ReflectedHttpActionDescriptor[])subRouteData.Route.DataTokens["actions"];
//This seems to get latest controller name. ie. V2
controllerName = actions[0].ControllerDescriptor.ControllerName;

现在,如果我请求版本 1,为了简单起见,我将使用查询字符串并调用 api/terms/bonuses?v=2

所以这段代码不再有效(显然)。

如何获取 V2 控制器名称?

如果我放弃路由属性并仅使用 WebApiConfig 路由,则此代码可以正常工作。

HttpControllerDescriptor controllerDescriptor = null; 
var controllers = GetControllerMapping();
var routeData = request.GetRouteData();
var controllerName = (string)routeData.Values["controller"];

UPDATE:

这是我的完整选择器代码。

IDictionary<string, HttpControllerDescriptor> controllers = GetControllerMapping();                                             

var attributedRoutesData = request.GetRouteData().GetSubRoutes();
var subRouteData = attributedRoutesData.LastOrDefault(); //LastOrDefault() will get PeopleController, FirstOrDefault will get People{version}Controller which we don't want

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


//For controller name without attribute routing
//var controllerName = (string)routeData.Values["controller"];

HttpControllerDescriptor oldControllerDescriptor;
if (controllers.TryGetValue(controllerName, out oldControllerDescriptor))
{
    //TODO: Different techniques for handling version api requests.
    var apiVersion = GetVersionFromQueryString(request);
    //var version = GetVersionFromHeader(request);
    //var version = GetVersionFromAcceptHeaderVersion(request);
    //var version = GetVersionFromMediaType(request);

    if (!String.IsNullOrEmpty(apiVersion))
    {
        var newControllerName = String.Concat(controllerName, "V", apiVersion);

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

 var subRouteData = request.GetRouteData().GetSubRoutes().LastOrDefault();

 if (subRouteData != null && subRouteData.Route != null)
 {
  var actions = subRouteData.Route.DataTokens["actions"] as HttpActionDescriptor[];

  if (actions != null && actions.Length > 0)
  {
     controllerName = actions[0].ControllerDescriptor.ControllerName;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用路由属性进行 Web API 版本控制时如何获取控制器名称 的相关文章

随机推荐

  • 使用robotframework-selenium时如何测试空白文本字段?

    将 robotsframework seleniumlibrary 与 TSV 文件一起使用时 如何为文本字段指定空白 空值 例如 我有以下内容 Textfield Value Should Be identifier name1 Chri
  • MySQL 行校验和

    是否可以选择表中的整行并获取校验和 我正在寻找一种方法来告诉我的代码仅在至少一条记录已更改时才更新数据 从数据更改跟踪的角度来看 它将帮助我缩小历史表中记录的许多更改的规模 您可以结合MD5 https dev mysql com doc
  • 如何在 JSP 中绑定动态字段列表

    我正在构建一个用于输入足球比赛结果的 JSP 页面 我得到了一份未解决的游戏列表 我想将它们列出如下 team1 vs team4 hidden field game id input field for home goals input
  • 从资产文件夹复制数据库[重复]

    这个问题在这里已经有答案了 我正在创建一个使用现有 sqlite 数据库的字典应用程序 我已将数据库放置在资产文件夹中 并在应用程序首次启动时使用以下代码来复制数据库 我借用了这个想法this http www reigndesign co
  • Android 拒绝来电

    在我的android项目 目标sdk版本23 中 我想拒绝来电 我知道对此有很多疑问 特别是 1 如何将 com android internal telephony ITelephony 导入到 Android 应用程序 https st
  • 找出给定数据集中每列缺失值的百分比

    import pandas as pd df pd read csv https query data world s Hfu PsEuD1Z yJHmGaxWTxvkz7W b0 percent 100 len df loc df isn
  • 将 JavaScript 转换为 Java [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有没有好的方法将JavaScript
  • 如何使用 jQuery 检查单选按钮?

    我尝试使用 jQuery 检查单选按钮 这是我的代码
  • 如何解决 SystemError: _internal 初始化失败而不引发异常?

    Problem 我编写了一个代码 将一些历史数据作为输入 假设数据集有一个timeseries格式 我正在尝试进行回归并找到预测变量 Code 对于我的项目 我有四个文件 my project py utilities py plotter
  • require.js POST 请求 spotify Web api 返回“解析 json 时出错”

    根据Spotify Web API 创建播放列表 https developer spotify com web api create playlist 一旦授权成功 带有 access token 和一些其他参数的 POST 应该为用户创
  • 多次检测到碰撞。

    我正在制作一个飞扬的小鸟游戏 当我的鸟经过每堵墙 收集一枚硬币时 我似乎遇到了问题 有2个问题 1 收集后游戏会滞后一毫秒 2 我的鸟似乎每次都会发生 2 次甚至 3 次碰撞 得分为 2 或 3 我无法理解这一点 我的鸟是一个 5 纹理动画
  • 使用shared_ptr和glutInit会导致分段错误

    经询问this https stackoverflow com questions 33855611 defining shared ptr causes segfault cmake在我尝试了很多东西并发现问题与 glutInit 有关之
  • 在使用 Material-UI 的 React 中复选框无法切换

    所以我有一个 React 代码 其中当我单击它时复选框不会切换 这是codesandbox链接 https codesandbox io s inspiring kirch q6p4h https codesandbox io s insp
  • 如何在所有处理程序之前运行函数?

    是否可以使用 net http 包或任何 gorilla 库在 Web 应用程序中的任何处理程序之前执行函数 例如 这对于在处理实际请求处理程序之前检查传入请求是否来自列入黑名单的 IP 地址非常有用 创建一个处理程序 在检查 IP 地址后
  • 在 C# 中将 DirectSound CaptureBuffer 的内容写入 WAV 文件

    我已将音频录制到 CaptureBuffer 但我不知道如何将其保存到 wav 文件中 我已经尝试过这个 http www tek tips com faqs cfm fid 4782 http www tek tips com faqs
  • 无法初始化索引器进程

    抱歉 问题重复了 但我找不到问题的答案 所以我再次发布 我尝试通过管理员重新索引 magento 1 7 0 2 由于服务器是共享服务器 我无法通过 shell 脚本运行索引器 虽然我尝试通过 cron 运行它 但它也不起作用 运行索引器进
  • 获取多行流布局的首选尺寸

    我无法找到一种方法来调整 Swing GUI 中某些组件的大小 一些自定义标签被添加到 FlowLayout 中 在调整对话框大小时 其行为不正常 该面板是使用 jgoodies 表单框架构建的 如果使用这个 FlowLayout 将被添加
  • malloc函数(动态内存分配)在全局使用时导致错误

    include
  • 处理 DART 中的事件

    我是 DART 新手 我阅读了语言概述并在 DART 编辑器中检查了示例代码 到目前为止我找不到如何处理 DART 中的事件 例如onclick call dart method 我们如何处理 DART 中的事件 这不是你在 Dart 上做
  • 使用路由属性进行 Web API 版本控制时如何获取控制器名称

    我需要从我的路由中获取控制器名称 如果在 WebApiConfig 中使用标准路由代码 我可以做到这一点 但是 如果我使用路由属性 它就会开始变得有点困难 尤其是在尝试版本控制时 示例 如果我调用 api terms bonuses 并且我