在我的c#代码中,我有一个方法在我的Microsoft.AspNetCore.Mvc.ApiController获取值。但是,如果我调用GetThingsAsync方法而没有在POST调用中设置Origin标头,则会得到一个400 BadRequest错误。
[HttpPost]
[Route("route")]
public async Task<IActionResult> GetThingsAsync(
[FromBody] SomeRequest someRequest,
[FromHeader(Name = "Origin")] string origin = "Unknown")
{
// Code goes here
}
我得到的错误是这样的:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "REDACTED",
"errors":
{
"Origin":
[
"The origin field is required."
]
}
}
现在,我假设我正在编写的代码应该有一个默认值Unknown,如果没有设置Origin。但是,原始值要么没有正确设置,要么验证可能在某种程度上过于热心。我想知道为什么我在运行此代码时没有在请求中设置Origin标头会出现错误。
我知道这个问题可以通过添加?到字符串参数,如下所示:
[HttpPost]
[Route("route")]
public async Task<IActionResult> GetThingsAsync(
[FromBody] SomeRequest someRequest,
[FromHeader(Name = "Origin")] string? origin = "Unknown")
{
// Code goes here
}
话虽这么说,我想知道为什么这个头是必需的,即使它有默认值。它是否被设置为空?
假设您使用ASP。
如本文件所述:
从。net 6开始,新的项目包括项目文件中的
<Nullable>enable</Nullable>
元素。一旦特性打开时,现有的引用变量声明变为非空引用类型.
使得非空属性必须在asp.net 6中必需,否则ModelState将无效。
一种方法是从项目文件中删除<Nullable>enable</Nullable>
。
另一种方法是像下面这样添加?
:
[HttpPost]
[Route("route")]
public void GetThingsAsync(
[FromBody] SomeRequestsomeRequest,
[FromHeader(Name = "Origin")] string? origin = "Unknown")
{
// Code goes here
}