首页 > 解决方案 > .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]属性一起使用?

标签: asp.net-web-api.net-core

解决方案


当您使用属性[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 请求中所述:

在此处输入图像描述


推荐阅读