asp.net-web-api - .NET Core ApiController-Attribute 推断错误绑定
问题描述
我目前对新的 .NET Core 2.1 属性有疑问[ApiController]
,不知道如何解决。如果我应用该属性,我会遇到推理问题。没有一切工作正常。
我有一个带有[ApiController]
属性的控制器和一个应该接受几个不同的标题和一个视图模型的动作。
动作如下所示:
[HttpPut]
public async Task<IActionResult> MyAction(MyHeaderClass myHeaders, [FromBody]MyViewModel myViewModel)
{
var resultObject = await DoSomething();
return Json("");
}
MyHeadersClass 如下所示:
public class MyHeadersClass
{
[FromHeader(Name = "X-Some-Id")]
[Required]
public string SomeId { get; set; }
[FromHeader(Name = "X-SomeGuid-Id")]
[Required]
public Guid? SomeGuid { get; set; }
}
如果我尝试启动我的应用程序,它会失败,因为 .NET Core 2.1 尝试推断MyHeaderClass
受请求主体约束。
唯一可行的是将[FromHeader]
属性应用于我的MyHeaderClass
但我必须指定一个标题
{
X-Some-Id: string,
X-SomeGuid-Id: string
}
但是我希望每个属性都有一个标题,并且在没有属性的情况下也可以使用。我可以更改什么以使其与该[ApiController]
属性一起使用?
解决方案
当您使用属性[FromHeader]标记标头时,不确定为什么要在请求正文中发送标头信息
唯一有效的是将 [FromHeader] 属性应用于我的 MyHeaderClass 但我必须指定一个标头
{ X-Some-Id: string, X-SomeGuid-Id: string }
我使用 POSTMAN 在 .NET core 2.1 上测试了您的代码,无论有没有[FromBody] Arttribute with [ApiController] present ,它都可以正常工作。
这是来自 POSTMan 的原始 HTTP 请求,其标头值位于标头部分而不是请求正文中:
POST /api/My/Register HTTP/1.1
Host: localhost:5001
Content-Type: application/json
X-Some-Id: idstring
X-SomeGuid-Id: guidstring
Postman-Token: 7fc48dc9-cb0b-46fd-8419-7ad4e3676855
{
"username":"rajesh",
"password":"password"
}
关键是您需要在 HTTP 请求中的正确位置添加标头值,如以下屏幕截图中来自 POSTMAN 工具的 HTTP 请求中所述:
推荐阅读
- python - django.db.utils.DataError: value too long for type character varying(650)
- c++ - C++ - 允许编译器回收已删除的指针变量吗?
- android - 如何让 Last LatLong 使用 FusedLocationProviderClient 进入服务?
- ios - 如何通过 UITapGestureRecognizer 将数据从一个 UIViewController 传递到另一个
- java - JMS 重新交付延迟,如斐波那契数
- node.js - 带有节点 mssql 的 Azure SQL 给出奇怪的错误
- actionscript-3 - 变量定义为字符串
- terminal - 字符显示宽度的终端控制序列?
- listview - 如何删除 Flutter ListView 中的剪辑?
- r - R:如何将相同的变量(行号)添加到列表中的每个数据框?