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 455dd52f24..7a7c8701ce 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 @@ -26,6 +26,12 @@ public class AbpNoContentActionFilter : IAsyncActionFilter, IAbpFilter, ITransie var returnType = context.ActionDescriptor.GetReturnType(); if (returnType == typeof(Task) || returnType == typeof(void)) { + if (context.HttpContext.Response.Body.CanSeek && context.HttpContext.Response.Body.Length != 0) + { + // Body has been written, so we should not change the status code. + return; + } + context.HttpContext.Response.StatusCode = (int)HttpStatusCode.NoContent; } } 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 0a2eae5c2b..ae6ca60bb8 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 @@ -1,4 +1,6 @@ -using System.Threading.Tasks; +using System; +using System.Text; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; namespace Volo.Abp.AspNetCore.Mvc.Response; @@ -55,4 +57,11 @@ public class NoContentTestController : AbpController { await Task.CompletedTask; } + + [HttpGet] + [Route("TestAsyncMethodChangeBody")] + public async Task TestAsyncMethodChangeBody() + { + await Response.Body.WriteAsync("TestBody"u8.ToArray()); + } } 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 9a3cbcd87b..a7136bc6f9 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 @@ -55,4 +55,12 @@ public class NoContentTestController_Tests : AspNetCoreMvcTestBase var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncMethodWithResultFilter"); result.StatusCode.ShouldBe(HttpStatusCode.OK); } + + [Fact] + public async Task Should_Not_Set_No_Content_If_Body_Changed() + { + var result = await GetResponseAsync("/api/NoContent-Test/TestAsyncMethodChangeBody"); + result.StatusCode.ShouldBe(HttpStatusCode.OK); + } + }