我可以在 Web API 中使用多个具有不同复杂参数类型的 POST 方法吗?

2024-01-18

我是 Web API 新手... 这是我的基本路线:

config.Routes.MapHttpRoute(
  name: "Workitems",
  routeTemplate: "api/{controller}/{workitemID}",
  defaults: new { controller = "workitems", workitemID = RouteParameter.Optional }
);

这就是我想要的:

public HttpResponseMessage Post( [FromBody] FolderModel theModel )
public HttpResponseMessage Post( [FromBody] DocumentModel theModel )

但是,Web API 找不到我的第二个 Post 方法。我在这里和谷歌中进行了大量搜索,但没有找到任何适合我的东西(好吧)。我知道我可以向第二个方法添加第二个未使用的参数 - 但这太过分了。如果这是正常的 C# 代码,编译器将毫无问题地知道选择哪个,因为方法具有不同的签名。但Web API不够智能。

我查看了自定义约束,但这似乎不合适。我也无法使用不同的 {actions},因为这违反了我的 API 的 RESTful 约束(没有 RPC,只有资源)。我也无法将第二篇文章放在不同的控制器上。

我让它工作的唯一方法是将FolderModel和DocumentModel包装在父对象中,如下所示:

public class WorkitemCreateModel
{
    public DocumentModel Document { get; set; }
    public FolderModel Folder { get; set; }
}

public HttpResponseMessage Post( [FromBody] WorkitemCreateModel theModel )

然后有一个采用 WorkitemCreateModel 的 Post 方法。但是,使用我的 API 的开发人员有责任必须传入 WorkitemCreateModel,但只能传入 DocumentModel 对象或 FolderModel 对象。这也很烦人,因为我的 GET API 可以返回 DocumentModel 对象或FolderModel 对象。因此,最好将从 GET 获取的对象传递到 POST 中。但这不起作用,他们必须首先将其包装在 WorkitemCreateModel 对象中。

还有其他建议吗?

顺便说一句:这个网站是最好的!我在这里找到了很多答案!


这可能是一篇旧帖子,但我添加此信息只是为了像我这样来这里寻找答案的人。

这里的简短答案是不,这是不可能的.

问题在于路由的工作方式,尤其是选择使用哪种操作方法的部分。以下是 ASP .NET 文章的摘录(https://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection https://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection),

选择算法的目标是在调用任何绑定之前从静态描述中选择一个操作。因此,复杂类型被排除在匹配算法之外。

因此,在将操作方法​​与路径匹配时,Web API忽略所有复杂类型在该方法的参数列表中,当您这样做时,您的两个方法都有 0 个参数,这就是您面临此问题的原因。

希望这可以帮助...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 Web API 中使用多个具有不同复杂参数类型的 POST 方法吗? 的相关文章

  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • EF Core 返回 null 关系,直到直接访问

    我有一些如下所示的模型 public class Mutant public long Id get set Relations public long OriginalCodeId get set public virtual Origi
  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 如何使用不同的基本路径托管 Blazor WebAssembly 应用程序

    我有一个 Blazor Webassemble NET 托管应用程序 在我们托管它的服务器上 应用程序的基本路径将是mydomain com coolapp 因此 为了尝试让应用程序在服务器上正确呈现 我一直遵循本页 应用程序基本路径 部分
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 并行运行多个任务

    我有一个代理列表 每个代理都会访问不同的站点并从站点中提取所需的数据 目前它一次只做一个 但我希望同时运行 10 20 个任务 这样它就可以一次性从 20 个站点下载 而不是只下载一个 这是我目前正在做的事情 private async T
  • 如何从经过身份验证的 SecurityToken 中获取声明

    我将令牌作为字符串传递到 SOAP 服务中 并验证了该令牌是否有效 我现在有一个 SecurityToken 在调试模式下我可以看到所有声明 特别是我想传递到另一个方法的 userId 声明 我似乎不知道如何获得这些索赔 现在 我解码了令牌
  • 如何在 Linux 上重新实现(或包装)系统调用函数?

    假设我想完全接管 open 系统调用 也许要包装实际的系统调用并执行一些日志记录 一种方法是使用 LD PRELOAD http scaryreasoner wordpress com 2007 11 17 using ld preload
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • 如何配置 qt Creator 以显示 C++ 代码而不是反汇编程序?

    昨天我做了很多事情 比如更新 GCC Clang 和重新安装 Qt Creator 今天 在逐步调试我的代码时 调试器显示的是反汇编代码 而不是我编写的 C 代码 紧迫F10 or F11 调试器正在进入汇编代码而不是 cpp nor h我
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗

随机推荐

  • 将子类转换为超类后调用方法的有趣行为

    class A int i 1 int f return i class B extends A int i 2 int Override f return i public class override test public stati
  • 在MySQL中存储图像[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 请给我在 MySQL 数据库中插入图像的查询 我是 stackoverflow 的新手 所以如果我的问题不符合标准 请忽略我 如果映像位于您
  • 人工智能中与最佳优先搜索相关的问题有哪些?

    我知道一般问题包括局部最大值和高原 但是我很好奇是否还有与此特定搜索相关的更多问题 以及为了克服这些问题我的最佳行动方案是什么 有人还可以给我一个例子 说明该搜索适合用于哪种类型的问题吗 最佳优先搜索的问题 它很贪婪 在许多情况下 它会带来
  • MySQL 中 utf8mb4 和 utf8 字符集有什么区别?

    有什么区别utf8mb4 and utf8字符集在MySQL 我已经知道了ASCII UTF 8 UTF 16 and UTF 32编码 但我很想知道有什么区别utf8mb4具有其他编码类型定义的编码组MySQL服务器 使用有什么特别的好处
  • TypeScript 使用实例访问静态变量

    所以在大多数OOP语言中静态变量也可以被称为class变量 即它们的值为shared在该类的所有实例中 例如 在我的游戏中我有一堂课Bullet其扩展为GreenBullet and PinkBullet 我希望这些子类有一个名为 类 或
  • 带有 date_trunk 函数和时区的 Django ORM

    我想用日期截断SQL 函数 但它似乎不适用于时区 使用 Django 进行测试 1 from django db import connection cursor connection cursor cursor execute SELEC
  • SVN 1.3 VS 1.5(最新)

    我们的IT人员已经安装了SVN 1 3 当前版本是1 5 我们正在从 CVS 迁移到 SVN 那么继续使用 1 3 会损失很多吗 我喜欢运行 CVS2SVN 并转移到 SVN 而不需要编写任何脚本 另外 在 CVS 中 我们的项目中有多个目
  • 如果视口为 480 像素或更小,请更改为 FullCalendar 中的 basicDay 视图?

    有没有一种简单的方法可以根据 FullCalendar 中的当前视口大小更改用户的视图 我想做的是在桌面上显示月视图 如果使用 iPhone 或移动设备则显示日视图 目前 使用月视图时 所有事件都被压缩在移动设备上 当前代码 documen
  • scandir - 对数字文件名进行排序

    做了一些搜索 但似乎找不到我正在寻找的确切答案 我想使用 scandir dir 提取带有编号文件名的文件 但让它们正确排序 例如 文件名是 1 something ext 2 something else ext 3 a third na
  • 如何设置等于Android上另一个小部件的宽度

    我需要在文本字段下方绘制一条水平线 使线的宽度等于文本宽度 而不是全屏的宽度 在我的应用程序中 我在视图 水平线 下方有一个文本视图 这线视图的宽度应等于文本视图的宽度 我尝试了 android layout width wrap cont
  • 匹配有效命名空间名称的正则表达式

    我以为这个问题以前有人问过 但我尝试谷歌但没有找到答案 也许我使用了错误的关键字 是否可以使用正则表达式来匹配有效的 C 命名空间名称 Update 感谢大家的回答和研究 这个问题比我想象的要复杂得多 作为奥斯卡 梅德罗斯 https st
  • 从 IIS 上的命令行列出所有托管网站

    我们如何通过 IIS 命令行列出所有托管网站 您可能必须以管理员身份运行它 appcmd list site 直接来自http technet microsoft com en us library cc771280 v ws 10 asp
  • 将一种类型的同构 HList 映射到不同类型的异构 List

    我有一个字符串 HList val strings The Lorax Dr Suess HNil 在另一个特殊类型列表中 case class Title title String words List String case class
  • 在 DAG 中使用 boto3 时,Apache Airflow 无法找到 AWS 凭证

    我们正在使用 ECS Fargate 迁移到 Apache Airflow 我们面临的问题 很简单 我们有一个简单的 DAG 其任务之一是与 AWS 中的某些外部服务进行通信 比方说 从 S3 下载文件 这是 DAG 的脚本 from ai
  • 是否有一个不重复的 List 实现?

    我知道关于SortedSet https docs oracle com javase 9 docs api java util SortedSet html 但就我而言 我需要一些实现List 并不是Set 那么 API 或其他地方是否有
  • 在 C++ 中保存 QML 图像

    我正在尝试使用 qml 显示网络图像 然后使用 c 代码保存该图像 这是qml代码 import QtQuick 2 3 import QtQuick Window 2 2 import com login 1 0 Window visib
  • Android Facebook SDK - 共享对话框不响应取消回调

    我正在我的 Android 应用程序上使用 Facebook sdk 4 0 我发现了这个问题 当我分享帖子时 我可以看到facebook界面 我可以完美地发布和取消它 我注册了回调 但是如果按取消按钮 则不会调用 onCancel 回调
  • C# 根据组合框选择启用/禁用多个文本框

    我只是一个正在学习如何编码的普通人 我不喜欢代码看起来很草率并且可以合并 话虽这么说 我需要合并一些代码 但我未能找到有关如何执行此操作的信息 我正在尝试根据组合框选择启用 禁用多个文本框 这是我试图整合的又长又丑的代码 private v
  • 如何在 Parcel 中使用 writeStringArray() 和 readStringArray()

    我最近在 Android 中遇到了一个非常愚蠢的 至少从我的角度来看 实现Parcel class 假设我有一个像这样的简单课程 class Foo implements Parcelable private String bars oth
  • 我可以在 Web API 中使用多个具有不同复杂参数类型的 POST 方法吗?

    我是 Web API 新手 这是我的基本路线 config Routes MapHttpRoute name Workitems routeTemplate api controller workitemID defaults new co