如何使ASP.NET Core void/Task操作方法返回204 No Content

Tom*_*han 5 c# asp.net-core-mvc asp.net-core

如何配置void/ Taskaction方法的响应类型204 No Content而不是200 OK

例如,考虑一个简单的控制器:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要两种方法都返回204 No Content,但默认(因而/foo返回)似乎是200 OK.我尝试了各种各样的东西,比如添加一个[ProducesResponseType(204)]属性/foo,但我没有发现任何似乎有任何影响的东西.

0xc*_*ced 10

下面是一个解决方案,对于所有void返回或 的控制器方法,返回 204 而不是 200 Task。首先,创建一个结果过滤器:

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)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后全局注册过滤器:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options => options.Filters.Add<VoidAndTaskTo204NoContentFilter>());
}
Run Code Online (Sandbox Code Playgroud)

这将影响您的所有控制器方法。


小智 0

控制器基类具有HttpResponse类型的 Response 属性。您可以直接设置:

 Response.StatusCode = 204 ;
Run Code Online (Sandbox Code Playgroud)