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)
| 归档时间: |
|
| 查看次数: |
2522 次 |
| 最近记录: |