ApiExplorer 无法识别自定义类型的路由属性

2023-12-09

我有一个项目,我想在其中使用自定义类型的路由属性。 我将自定义类型作为查询参数的以下代码工作正常,并且帮助页面显示自定义类型。

// GET api/values?5,6
[Route("api/values")]
public string Get(IntegerListParameter ids)
{
    return "value";
}

WebApi.HelpPage 提供以下文档帮助:页面

如果我更改代码以使用路由属性,结果是我得到一个空的帮助页面。

// GET api/values/5,6
[Route("api/values/{ids}")]
public string Get(IntegerListParameter ids)
{
    return "value";
}

当我检查 HelpController.cs 中的代码时,我观察到 ApiExplorer.ApiDescriptions 返回 ApiDescriptions 的空集合

public ActionResult Index()
{
    ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider();
    Collection<ApiDescription> apiDescriptions = Configuration.Services.GetApiExplorer().ApiDescriptions;

    return View(apiDescriptions);
}

有什么方法可以让 ApiExplorer 将我的自定义类 IntegerListParameter 识别为属性路由?


你需要:

  1. 为您的添加 HttpParameterBindingIntegerListParameter type
  2. 将绑定标记为IValueProviderParameterBinding并实施ValueProviderFactories
  3. 添加转换器IntegerListParameter并覆盖CanConvertFrom方法用于typeof(string)范围

完成这些操作后,ApiExplorer 中必须识别具有自定义类型 IntegerListParameter 的路由。

请参阅我的示例了解类型ObjectId:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //...
        config.ParameterBindingRules.Insert(0, GetCustomParameterBinding);
        TypeDescriptor.AddAttributes(typeof(ObjectId), new TypeConverterAttribute(typeof(ObjectIdConverter)));
        //...
    }

    public static HttpParameterBinding GetCustomParameterBinding(HttpParameterDescriptor descriptor)
    {
        if (descriptor.ParameterType == typeof(ObjectId))
        {
            return new ObjectIdParameterBinding(descriptor);
        }
        // any other types, let the default parameter binding handle
        return null;
    }
}

public class ObjectIdParameterBinding : HttpParameterBinding, IValueProviderParameterBinding
{
    public ObjectIdParameterBinding(HttpParameterDescriptor desc)
        : base(desc)
    {
    }

    public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        try
        {
            SetValue(actionContext, new ObjectId(actionContext.ControllerContext.RouteData.Values[Descriptor.ParameterName] as string));
            return Task.CompletedTask;
        }
        catch (FormatException)
        {
            throw new BadRequestException("Invalid id format");
        }
    }

    public IEnumerable<ValueProviderFactory> ValueProviderFactories { get; } = new[] { new QueryStringValueProviderFactory() };
}

public class ObjectIdConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
            return true;
        return base.CanConvertFrom(context, sourceType);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ApiExplorer 无法识别自定义类型的路由属性 的相关文章

  • 简单的C问题

    作为我正在进行的项目的一部分 我必须开始学习 C 我已经开始解决其中的 欧拉 问题 并且遇到了麻烦 我必须找到 1000 以下的所有 3 或 5 的倍数之和 有人可以帮助我吗 谢谢 include
  • 从 Dropbox C# 下载文件[重复]

    这个问题在这里已经有答案了 我正在尝试下载 Dropbox 中的 pdf 文件 我需要将其保存到本地计算机中 可以是任何文件夹C Users User Desktop例如 这是我一直在使用的代码 public void DownloadPd
  • 在列表中查找匹配项的最简洁方法

    在列表中查找内容的最佳方式是什么 我知道 LINQ 有一些不错的技巧 但我们也可以获取有关 C 2 0 的建议 让我们对这个常见的代码模式进行最佳重构 目前我使用这样的代码 mObjList is a List
  • 是否可以通过引用以基类作为参数的函数来传递派生类

    假设我们有一个抽象基类IBase使用纯虚方法 接口 然后我们推导出CFoo CFoo2来自基类 我们有一个知道如何使用 IBase 的函数 Foo IBase input 这些情况下通常的场景是这样的 IBase ptr static ca
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • std::async 参数的生命周期是多少?

    看来函数的参数是通过std async分享未来的生活 include
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • Ajax 函数在重定向后不保存滚动位置

    正如标题所述 我编写了一个 ajax 函数 该函数应该滚动到用户在重定向之前所在的位置 我写了一个alert对于测试场景 它确实触发了 但滚动不断回到顶部 我在这里做错了什么 JavaScript ajax type GET url Adm
  • C++ 中类型信息何时向后流动?

    我刚刚看了 Stephan T Lavavej 的演讲CppCon 2018关于 类模板参数推导 在哪里某个点 https youtu be H ut6j1BYU t 941他顺便说 在 C 中 类型信息几乎永远不会向后流动 我不得不说 几
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • 将华氏温度转换为摄氏度的 C 程序始终打印零

    我需要一些关于用 C 语言将华氏温度转换为摄氏度的程序的帮助 我的代码如下所示 include
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • 为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构

    我对这段代码有一个误解 typedef struct EXP int x char name char lastName 40 XMP main XMP a a name eaaa a lastName strcpy a lastName
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • Matlab打印板

    我是 Matlab 新手 有没有办法使用printmat打印2个字的标题 结果示例如下 Title One Title Two Title Three 11 22 33 22 33 44 这是我当前尝试修改的代码 matA 11 22 33
  • 如何在canvas、html5中旋转形状?

    我试图用这个旋转一条线 window onload function var canvas document getElementById foo var context canvas getContext 2d context moveT
  • 使用 Mockito 时模拟和监视有什么区别?

    使用 Mockito 间谍的用例是什么 在我看来 每个间谍用例都可以使用 callRealMethod 进行模拟处理 我看到的一个区别是 如果您希望大多数方法调用都是真实的 那么使用模拟与间谍可以节省一些代码行 是这样还是我错过了更大的图景
  • 如何在 MySQL 中使用“WITH”子句?

    我正在将所有 SQL Server 查询转换为 MySQL 并且我的查询已WITH他们都失败了 这是一个例子 WITH t1 AS SELECT article userinfo category FROM question INNER J
  • 遍历 NSData 并抓取块

    有什么方法可以迭代 NSData 以便我可以根据特定的字节模式拆分它 我需要将某些块分解成一个数组以便以后查找 拆分一个NSData在某些分隔符上 您可以使用以下命令搜索分隔符rangeOfData options range 然后使用分割
  • d3.IE 中的选择类型检查

    如何检查给定对象是否是d3选择 下面的代码打印true在 Chrome 和 Firefox 中 但是false在 Internet Explorer 中 console log d3 select document body instanc
  • 正确的安装顺序 VS 2012 Express 和 SQL Server 2012 Express

    在未安装任何 SQL Server 版本的 Win7 64 系统上 我安装了 Visual Studio 2012 for Web 我以为它会给我安装 SQL Server 2012 Express 的选项 但事实并非如此 现在我想在安装完
  • 德塔云平台无法使用FastAPI上传文件

    当我通过运行此代码时uvicorn main app一切正常 但是当我使用 Deta 运行它时 我得到Internal Server Error并且只有GET端点工作 POST一个甚至没有像应该的那样被调用 你能帮我么 提前致谢 impor
  • 本地数据库插入未存储

    这可能是我的一个愚蠢的错误 但我似乎无法理解它 我创建了一个新的空 C Windows 窗体应用程序 我添加了一个数据库 基于数据集 并将文件存储在我的解决方案资源管理器中 我添加了一个表Test带柱Name 我使用添加一条记录new Sq
  • Scala 方法调用中的大括号[重复]

    这个问题在这里已经有答案了 在 Scala 中 我们可以 println 你好 世界 摘自 Scala 编程 一书 这种用花括号代替圆括号的能力的目的 传入一个参数是为了让客户端程序员能够编写函数 大括号之间的文字 这可以使方法调用感觉更像
  • Linux 支持进程的内存隔离吗?

    更详细地说 问题是 没有root权限 一个进程是否可以读取 而不仅仅是写入 另一个进程的内存 例如 通过某种方式读取 proc gcore 或 proc PID mem 我还不确定他们的权限要求 我确实明白虚拟地址是实现的 每个进程都有自己
  • 如何在 ListView 中将图像从 PHP 服务器延迟加载到 Android

    我是 android 新手并正在探索它 我需要在如下所示的列表中动态加载用户图像 用户列表 我使用一张静态图像来显示资源文件夹中的用户图像 该列表是动态的 并且随着我的位置的变化而变化 但仅当我刷新它时 AddObjectToList jF
  • DOM 内容加载后附加的元素中的事件监听器

    我需要听一个 改变 事件
  • D3 区分具有拖动行为的元素的单击和拖动

    我无法成功区分click事件和drag使用 D3 js v3 绑定到两者的元素上的事件 下面代码中的圆圈被分配了拖动行为和click听众 演示在这里 var dragGroup d3 behavior drag on dragstart f
  • 将鼠标悬停在 li 上时更改文本颜色

    我想在出现链接时更改链接的文本颜色 li 元素悬停在上面 现在我有 nav li a hover margin left 10px padding left 10px background color 13118C color white
  • PHP、SimpleXML 对象的 json_encode、json_decode

    我的应用程序中的函数执行以下操作 使用史努比捕获网页 将结果加载到 DOMDocument 中 将 DOMDocument 加载到简单 XML 对象中 运行 XPath 来隔离所需文档的部分 对结果进行 json encode 并保存到数据
  • 何时在 Scala 方法声明中使用等号?

    带等号 object HelloWorld def main args Array String println Hello 没有等号 object HelloWorld def main args Array String println
  • (开放泛型类型)不指定参数的 typeof 泛型类型

    有人可以向我解释一下 C 语言的需求吗typeof SomeGenericType lt gt 没有指定具体参数 我整理了以下示例 var t1 typeof Nullable lt gt var t2 typeof Nullable
  • 使用 SVG 制作动画并翻转六边形

    我从未真正使用过 SVG 但现在阅读了一些有关它的教程并测试了一些东西 我正在学习如何制作类似六边形的形状 但现在需要使其在垂直轴上向下翻转并扩大尺寸 同时保持未翻转六边形的底部作为新翻转六边形的顶部 我的代码在这里 div class v
  • ApiExplorer 无法识别自定义类型的路由属性

    我有一个项目 我想在其中使用自定义类型的路由属性 我将自定义类型作为查询参数的以下代码工作正常 并且帮助页面显示自定义类型 GET api values 5 6 Route api values public string Get Inte