From 583f76fe3b98623baa80c017421bcefdff46153a Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Fri, 15 May 2020 14:37:36 +0200 Subject: [PATCH] Fixed: exception logged in Kestrel on Delete request When an ActionResult returns null, we wrap that in a json:api response, causing an error from Kestrel because it does not allow a response body to be sent in some cases. See https://github.com/aspnet/KestrelHttpServer/blob/50bb0b3bc9c45e5c89617b9769959aa32e12278b/src/Kestrel.Core/Internal/Http/HttpProtocol.cs#L1270-L1275 for details. --- src/JsonApiDotNetCore/Formatters/JsonApiWriter.cs | 14 ++++++++++++-- test/NoEntityFrameworkTests/WorkItemTests.cs | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/JsonApiDotNetCore/Formatters/JsonApiWriter.cs b/src/JsonApiDotNetCore/Formatters/JsonApiWriter.cs index 61ae579320..e9f1c95f6f 100644 --- a/src/JsonApiDotNetCore/Formatters/JsonApiWriter.cs +++ b/src/JsonApiDotNetCore/Formatters/JsonApiWriter.cs @@ -77,9 +77,19 @@ private string SerializeResponse(object contextObject, HttpStatusCode statusCode throw new UnsuccessfulActionResultException(problemDetails); } - if (contextObject == null && !IsSuccessStatusCode(statusCode)) + if (contextObject == null) { - throw new UnsuccessfulActionResultException(statusCode); + if (!IsSuccessStatusCode(statusCode)) + { + throw new UnsuccessfulActionResultException(statusCode); + } + + if (statusCode == HttpStatusCode.NoContent || statusCode == HttpStatusCode.ResetContent || + statusCode == HttpStatusCode.NotModified) + { + // Prevent exception from Kestrel server, caused by writing data:null json response. + return null; + } } contextObject = WrapErrors(contextObject); diff --git a/test/NoEntityFrameworkTests/WorkItemTests.cs b/test/NoEntityFrameworkTests/WorkItemTests.cs index c4f687c383..2bb2edc35f 100644 --- a/test/NoEntityFrameworkTests/WorkItemTests.cs +++ b/test/NoEntityFrameworkTests/WorkItemTests.cs @@ -146,7 +146,7 @@ await ExecuteOnDbContextAsync(async dbContext => string responseBody = await response.Content.ReadAsStringAsync(); var document = JsonConvert.DeserializeObject(responseBody); - Assert.Null(document.Data); + Assert.Null(document); } private async Task ExecuteOnDbContextAsync(Func asyncAction)