Open spaasis opened 2 years ago
Same here. Works in Version 6.2.3 and breaks in 6.3.0.
Same story
Still happens in 6.3.1
Some more diagnostics and a workaround:
Besides the explicit config in the opening post, the same issue is caused when an OData controller has a PATCH/POST/PUT that takes the parameters from query instead of request body:
[HttpPatch]
public async Task<ActionResult> Patch([FromQuery] MyCommand cmd) {
This causes the relative url to have ?
and the error is thrown.
I worked around this myself by splitting these write operations to a different, non-odata controller
Still broken in 6.4.0
Still broken! Cannot define a route with [Route("api/test?id={var}")]
Work-around:
Swashbuckle.AspNetCore.6.4.0-preview-2078.zip
Create/update NuGet.Config and point to local repository:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
<add key="Local Swashbuckle.AspNetCore" value="..\..\..\Third Party\Swashbuckle\Swashbuckle.AspNetCore\6.4.0-preview-2078" />
</packageSources>
</configuration>
Update NuGet package references to use these packages instead.
As another work-around, migrate to NSwag.AspNetCore and use the following document processor:
using System.Collections.Generic;
using System.Linq;
using NJsonSchema;
using NSwag;
using NSwag.Generation.Processors;
using NSwag.Generation.Processors.Contexts;
/// <summary>
/// Removes query string parameters from paths in the Open API specification document.
/// </summary>
/// <seealso cref="NSwag.Generation.Processors.IDocumentProcessor" />
public class RemoveQueryStringParametersFromPathsDocumentProcessor : IDocumentProcessor
{
/// <inheritdoc/>
public void Process(DocumentProcessorContext context)
{
List<string> pathsToFix = new List<string>();
foreach (var path in context.Document.Paths)
{
if (path.Key.Contains('?'))
{
pathsToFix.Add(path.Key);
}
}
foreach (var pathToFix in pathsToFix)
{
string key = pathToFix[..pathToFix.IndexOf('?')];
var pathItem = context.Document.Paths[pathToFix];
if (context.Document.Paths.ContainsKey(key))
{
context.Document.Paths[key].AddRange(pathItem);
}
else
{
context.Document.Paths.Add(key, pathItem);
}
context.Document.Paths.Remove(pathToFix);
}
}
}
Usage, in Startup.cs in ConfigureServices:
services.AddOpenApiDocument((settings, serviceProvider) =>
{
settings.DocumentProcessors.Add(new RemoveQueryStringParametersFromPathsDocumentProcessor());
}
It still exists in 6.5.0... Any solution for that for shawbuckle package?
This issue is stale because it has been open for 60 days with no activity. It will be automatically closed in 14 days if no further updates are made.
Community contributions to fix this are welcome.
Otherwise this will continue to be an issue as long as this issue is open.
Hi,
Recently updated from 6.2.1 to 6.3.0 and stuff started breaking. I'm running an OData controller via aspnet-api-versioning
Any endpoint within an OData controller with manually defined query parameters results in
System.ArgumentException: The literal section 'QuantityUnits?onlyValid=' is invalid. Literal sections cannot contain the '?' character. (Parameter 'routeTemplate')
Controller and endpoint:
This works in 6.2.1. In 6.2.3 I observed that the swagger.json generation works, but the endpoint produced has a trailing
{
, e.g./api/v1/odata/QuantityUnits{
which of course doesn't really work.Any idea where to start digging?
Full stack trace: