使用这种方法运行 swagger 时遇到问题。你能帮我吗?
[HttpPost]
[ApiVersion("1.0")]
public IActionResult SetEmployeeV1()
{
v1 ...
}
[HttpPost]
[ApiVersion("2.0")]
public IActionResult SetEmployeeV2()
{
v2 ...
}
我创建了 2 个控制器来代表不同的版本。
这是第一版。
using Microsoft.AspNetCore.Mvc;
namespace WebApiNet6.Controllers.V1
{
//[Route("api/[controller]")]
[ApiController]
[Route("api/v{version:apiVersion}/Data")]
[ApiVersion("1.0")]
public class DataController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
[HttpGet]
public IEnumerable<string> Get()
{
return Summaries.Where(x => x.StartsWith("C"));
}
}
}
这是版本 2:
namespace WebApiNet6.Controllers.V2
{
//[Route("api/[controller]")]
[ApiController]
[Route("api/v{version:apiVersion}/Data")]
[ApiVersion("2.0")]
public class DataController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
[HttpGet]
public IEnumerable<string> Get()
{
return Summaries.Where(x => x.StartsWith("S"));
}
}
}
现在我可以在浏览器中成功调用它们,但是我不能让api以swagger方式显示。所以我需要修改Program.cs(.net 5中的Startup.cs)
using Microsoft.OpenApi.Models;
builder.Services.AddApiVersioning(setup =>
{
setup.DefaultApiVersion = new ApiVersion(1, 0);
setup.AssumeDefaultVersionWhenUnspecified = true;
setup.ReportApiVersions = true;
});
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c => {
c.SwaggerDoc("v1", new OpenApiInfo
{
Version = "v1",
Title = "this is V1"
});
c.SwaggerDoc("v2", new OpenApiInfo
{
Version = "v2",
Title = "this is V2"
});
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
});
app.UseSwagger();
app.UseSwaggerUI();
我遇到了同样的错误
SwaggerGeneratorException: Conflicting method/path combination "PATCH api/ Actions require a unique method/path combination for Swagger/OpenAPI 3.0. Use ConflictingActionsResolver as a workaround
。您可以通过访问 Swagger 链接来获取实际错误,如下所示。
https://localhost:{yourport}/swagger/v1/swagger.json
当多个 API 有相同的路由时,就会发生这种情况。例如:-
/// <summary>
/// Do something 1.
/// </summary>
/// <returns></returns>
[HttpPatch]
public string Do1() => Dosomething1();
/// <summary>
/// Do something 2.
/// </summary>
/// <returns></returns>
[HttpPatch]
public string Do2() => Dosomething2();
您所要做的就是将其更改为特定路线,如
[HttpPatch("Do1")]
和
[HttpPatch("Do2")]
。 /// <summary>
/// Do something 1.
/// </summary>
/// <returns></returns>
[HttpPatch("Do1")]
public string Do1() => Dosomething1();
/// <summary>
/// Do something 2.
/// </summary>
/// <returns></returns>
[HttpPatch("Do2")]
public string Get2() => Dosomething2();
builder.Services.AddSwaggerGen(c => {
c.IgnoreObsoleteProperties = true;
c.OperationProcessors.Add(new IncludeControllersInSwagger());
});