diff --git a/src/JsonApiDotNetCore/QueryStrings/QueryStringReader.cs b/src/JsonApiDotNetCore/QueryStrings/QueryStringReader.cs index c412d03c94..e3c944a045 100644 --- a/src/JsonApiDotNetCore/QueryStrings/QueryStringReader.cs +++ b/src/JsonApiDotNetCore/QueryStrings/QueryStringReader.cs @@ -38,6 +38,11 @@ public void ReadAll(DisableQueryStringAttribute? disableQueryStringAttribute) foreach ((string parameterName, StringValues parameterValue) in _queryStringAccessor.Query) { + if (parameterName.Length == 0) + { + continue; + } + IQueryStringParameterReader? reader = _parameterReaders.FirstOrDefault(nextReader => nextReader.CanRead(parameterName)); if (reader != null) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/QueryStringTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/QueryStringTests.cs index 0aa955a219..4f6ee95ad2 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/QueryStringTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/QueryStringTests.cs @@ -63,6 +63,24 @@ public async Task Can_use_unknown_query_string_parameter() httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK); } + [Theory] + [InlineData("")] + [InlineData("bar")] + public async Task Can_use_empty_query_string_parameter_name(string parameterValue) + { + // Arrange + var options = (JsonApiOptions)_testContext.Factory.Services.GetRequiredService(); + options.AllowUnknownQueryStringParameters = false; + + string route = $"calendars?={parameterValue}"; + + // Act + (HttpResponseMessage httpResponse, Document _) = await _testContext.ExecuteGetAsync(route); + + // Assert + httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK); + } + [Theory] [InlineData("filter")] [InlineData("sort")]