如何将void
/Task
操作方法的响应类型配置为204 No Content
而不是200 OK
?
例如,考虑一个简单的 Controller :
public class MyController : Controller
{
[HttpPost("foo")]
public async Task Foo() {
await Task.CompletedTask;
}
[HttpPost("bar")]
public async Task<IActionResult> Bar() {
await Task.CompletedTask;
return NoContent();
}
}
我希望这两种方法都返回
204 No Content
,但是默认值(以及/foo
返回的内容)似乎是200 OK
。我尝试了各种方法,例如将[ProducesResponseType(204)]
属性添加到/foo
,但是我还没有发现似乎有任何效果的任何东西。 最佳答案
这是为返回所有void
或Task
的所有 Controller 方法返回204而不是200的解决方案。首先,创建一个结果过滤器:
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using static Microsoft.AspNetCore.Http.StatusCodes;
namespace StackOverflow.SampleCode
{
/// <summary>
/// A filter that transforms http status code 200 OK to 204 No Content for controller actions that return nothing,
/// i.e. <see cref="System.Void"/> or <see cref="Task"/>.
/// </summary>
internal class VoidAndTaskTo204NoContentFilter : IResultFilter
{
/// <inheritdoc/>
public void OnResultExecuting(ResultExecutingContext context)
{
if (context.ActionDescriptor is ControllerActionDescriptor actionDescriptor)
{
var returnType = actionDescriptor.MethodInfo.ReturnType;
if (returnType == typeof(void) || returnType == typeof(Task))
{
context.HttpContext.Response.StatusCode = Status204NoContent;
}
}
}
/// <inheritdoc/>
public void OnResultExecuted(ResultExecutedContext context)
{
}
}
}
然后全局注册过滤器:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options => options.Filters.Add<VoidAndTaskTo204NoContentFilter>());
}
这将影响您的所有 Controller 方法。
关于c# - 如何使ASP.NET Core无效/任务操作方法返回204无内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50325969/