我可以添加具有向后兼容性的 [FromBody] 参数吗?



我有没有[FromBody]参数的端点:

[HttpPost("{id:int}/publish")]
public async Task<IActionResult> Publish()
{
<do some stuff>
return Ok();
}

但是现在我需要添加 [FromBody] 参数,以便旧代码仍然可以在没有参数的情况下使用此端点:

[HttpPost("{id:int}/publish")]
public async Task<IActionResult> Publish([FromBody] PublishRequest request)
{
<do some stuff>
return Ok();
}

但是,如果我以这种方式添加它并尝试用空体调用此端点,则返回 415(不支持的媒体类型(响应。

我想使此更改向后兼容。因此,应该可以在没有请求正文和内容类型标头的情况下使用此终结点。可能吗?

似乎不支持可选的FromBody参数 ATM,但在此 github 问题中发布了一种可能的解决方法:

public class SomeClassModelBinder : IModelBinder
{
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
var stream = bindingContext.HttpContext.Request.Body;
string body;
using (var reader = new StreamReader(stream))
{
body = await reader.ReadToEndAsync();
}
var someClass = JsonConvert.DeserializeObject<SomeClass>(body);
bindingContext.Result = ModelBindingResult.Success(someClass);
}
}
[FromBody, ModelBinder(BinderType = typeof(SomeClassModelBinder))] SomeClass request,

您可以将 PublishRequest 设置为可选。

[HttpPost("{id:int}/publish")]
public async Task<IActionResult> Publish([FromBody] PublishRequest? request)
{
// <do some stuff>
return Ok();
}

最新更新