diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs index b6d56b2f2a..2b38c4d484 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Response/AbpNoContentActionFilter.cs @@ -18,7 +18,8 @@ namespace Volo.Abp.AspNetCore.Mvc.Response await next(); - if (context.HttpContext.Response.StatusCode == (int)HttpStatusCode.OK) + if (context.HttpContext.Response.StatusCode == (int)HttpStatusCode.OK + && context.Result == null) { var returnType = context.ActionDescriptor.GetReturnType(); if (returnType == typeof(Task) || returnType == typeof(void)) diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController.cs index dc0ae30d71..9f8e431d51 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController.cs @@ -47,5 +47,13 @@ namespace Volo.Abp.AspNetCore.Mvc.Response Response.Redirect("/"); await Task.CompletedTask; } + + [HttpGet] + [Route("TestAsyncMethodWithResultFilter")] + [TestResultFilter] + public async Task TestAsyncMethodWithResultFilter() + { + await Task.CompletedTask; + } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController_Tests.cs index 0002a4801b..b11a185d68 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/NoContentTestController_Tests.cs @@ -10,49 +10,50 @@ namespace Volo.Abp.AspNetCore.Mvc.Response [Fact] public async Task Should_Set_No_Content_For_Void_Action() { - var result = await GetResponseAsync("/api/NoContent-Test/TestMethod", HttpStatusCode.NoContent) - ; + var result = await GetResponseAsync("/api/NoContent-Test/TestMethod", HttpStatusCode.NoContent); result.StatusCode.ShouldBe(HttpStatusCode.NoContent); } [Fact] public async Task Should_Not_Set_No_Content_For_Not_Void_Action() { - var result = await GetResponseAsync("/api/NoContent-Test/TestMethodWithReturn") - ; + var result = await GetResponseAsync("/api/NoContent-Test/TestMethodWithReturn"); result.StatusCode.ShouldBe(HttpStatusCode.OK); } [Fact] public async Task Should_Not_Set_No_Content_For_Custom_Http_Status_Code_Action() { - var result = await GetResponseAsync("/api/NoContent-Test/TestCustomHttpStatusCodeMethod", HttpStatusCode.Redirect) - ; + var result = await GetResponseAsync("/api/NoContent-Test/TestCustomHttpStatusCodeMethod", HttpStatusCode.Redirect); result.StatusCode.ShouldBe(HttpStatusCode.Redirect); } [Fact] public async Task Should_Set_No_Content_For_Task_Action() { - var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncMethod", HttpStatusCode.NoContent) - ; + var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncMethod", HttpStatusCode.NoContent); result.StatusCode.ShouldBe(HttpStatusCode.NoContent); } [Fact] public async Task Should_Not_Set_No_Content_For_Not_Task_Action() { - var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncMethodWithReturn") - ; + var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncMethodWithReturn"); result.StatusCode.ShouldBe(HttpStatusCode.OK); } [Fact] public async Task Should_Not_Set_No_Content_For_Custom_Http_Status_Code_Async_Action() { - var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncCustomHttpStatusCodeMethod", HttpStatusCode.Redirect) - ; + var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncCustomHttpStatusCodeMethod", HttpStatusCode.Redirect); result.StatusCode.ShouldBe(HttpStatusCode.Redirect); } + + [Fact] + public async Task Should_Not_Set_No_Content_For_Custom_Result_Filter_Async_Action() + { + var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncMethodWithResultFilter"); + result.StatusCode.ShouldBe(HttpStatusCode.OK); + } } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/TestResultFilter.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/TestResultFilter.cs new file mode 100644 index 0000000000..8cbbbc4399 --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Response/TestResultFilter.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Abstractions; +using Microsoft.AspNetCore.Mvc.Filters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Volo.Abp.AspNetCore.Mvc.Response +{ + public class TestResultFilter : Attribute, IAsyncActionFilter + { + public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + await next(); + context.Result = new ObjectResult("TestResultFilter"); + } + } +}