diff --git a/src/Microsoft.AspNetCore.OData/Formatter/ODataOutputFormatter.cs b/src/Microsoft.AspNetCore.OData/Formatter/ODataOutputFormatter.cs index d664d1df9..d9255bfed 100644 --- a/src/Microsoft.AspNetCore.OData/Formatter/ODataOutputFormatter.cs +++ b/src/Microsoft.AspNetCore.OData/Formatter/ODataOutputFormatter.cs @@ -194,7 +194,8 @@ public override void WriteResponseHeaders(OutputFormatterWriteContext context) // Set the character set. MediaTypeHeaderValue currentContentType = GetContentType(response.Headers[HeaderNames.ContentType].FirstOrDefault()); RequestHeaders requestHeader = request.GetTypedHeaders(); - if (requestHeader != null && requestHeader.AcceptCharset != null) + // Starting from ASP .NET Core 3.0 AcceptCharset returns an empty collection instead of null. + if (requestHeader?.AcceptCharset.Count > 0) { IEnumerable acceptCharsetValues = requestHeader.AcceptCharset.Select(cs => cs.Value.Value); diff --git a/test/Microsoft.AspNetCore.OData.E2E.Tests/Enums/EnumsTest.cs b/test/Microsoft.AspNetCore.OData.E2E.Tests/Enums/EnumsTest.cs index 71e316561..01055c8b3 100644 --- a/test/Microsoft.AspNetCore.OData.E2E.Tests/Enums/EnumsTest.cs +++ b/test/Microsoft.AspNetCore.OData.E2E.Tests/Enums/EnumsTest.cs @@ -178,6 +178,32 @@ public async Task QueryEntitySetCount(string requestUri, int expectedCount) Assert.Equal(expectedCount, int.Parse(count)); } + [Theory] + [InlineData("/convention/Employees/$count", true)] + [InlineData("/convention/Employees/$count", false)] + public async Task QueryEntitySetCountEncoding(string requestUri, bool sendAcceptCharset) + { + // Arrange + await ResetDatasource(); + HttpClient client = CreateClient(); + client.DefaultRequestHeaders.AcceptCharset.Clear(); + if (sendAcceptCharset) + { + client.DefaultRequestHeaders.AcceptCharset.ParseAdd("utf-8"); + } + + // Act + HttpResponseMessage response = await client.GetAsync(requestUri); + + // Assert + Assert.True(response.IsSuccessStatusCode); + var blob = await response.Content.ReadAsByteArrayAsync(); + Assert.Equal("utf-8", response.Content.Headers.ContentType.CharSet, StringComparer.OrdinalIgnoreCase); + var count = Encoding.UTF8.GetString(blob); + Assert.Equal(3, int.Parse(count)); + Assert.False((blob[0] == 0xEF) && (blob[1] == 0xBB) && (blob[2] == 0xBF)); + } + [Theory] [InlineData("/convention/Employees(1)/SkillSet/$count", 2)] [InlineData("/convention/Employees(1)/SkillSet/$count?$filter=$it eq Microsoft.AspNetCore.OData.E2E.Tests.Enums.Skill'Sql'", 1)]