如何将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,但是我还没有发现似乎有任何效果的任何东西。

最佳答案

这是为返回所有voidTask的所有 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/

10-12 00:12
查看更多