我正在尝试使用Swashbuckle.AspNetCore(3.0.0)帮助创建的Autorest和Swagger文档来生成REST API客户端.
生成的swagger文档似乎是正确的,除了操作名称不是很好.
"/api/Addresses/{id}": {
"get": {
"tags": [ "Address" ],
"operationId": "ApiAddressesByIdGet",
"consumes": [],
"produces": [],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"type": "string",
"format": "uuid"
}
],
"responses": { "200": { "description": "Success" } }
},
Run Code Online (Sandbox Code Playgroud)
我在许多文章和SwashBuckle.AspNetCore的官方文档中看到我可以使用属性来装饰我的控制器方法,如下所示:
[HttpGet]
[Produces("application/json")]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
[ProducesResponseType(typeof(List<AddressDto>), (int)HttpStatusCode.OK)]
[SwaggerOperation("GetAllAdresses")]
public async Task<IActionResult> GetAllAsync()
{
....
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到了一个错误:无法找到SwaggerOperationAttribute!
我验证了安装的nuget包,它们是:
有人可以帮帮我吗?请
有什么方法可以更改使用最少 api 编写的给定方法的标签吗http?
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
...
app.MapGet("/todo", () => "Hello world");
Run Code Online (Sandbox Code Playgroud)
这样我就可以在文档中对方法进行逻辑分组,类似于它们在控制器中时的方法。
我尝试过(来自@Modar Na的提示)SwaggerOperation,不幸的是它没有帮助。
app.MapGet("/todo", [SwaggerOperation(Tags = new[] { "ToDo" })]() => "Hello world");
app.MapPost("/todo", [SwaggerOperation(Tags = new[] { "ToDo" })]() => "Hello world");
app.MapGet("/projects", [SwaggerOperation(Tags = new[] { "Projects" })]() => "Hello world");
app.MapPost("/projects", [SwaggerOperation(Tags = new[] { "Projects" })]() => "Hello world");
Run Code Online (Sandbox Code Playgroud)
作为解决方法,我TagActionsBy在配置 swagger 生成器时使用了该方法。
builder.Services.AddSwaggerGen(c =>
{
c.TagActionsBy(d =>
{
return new List<string>() { d.ActionDescriptor.DisplayName! };
});
});
Run Code Online (Sandbox Code Playgroud)
请参阅我的 …
我有Swashbuckle带注释的代码,如下所示:
[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
public class AddressesController : Controller
{
[HttpGet("{aid}")]
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(PostalRecord))]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
我想使用GroupActionsBy自定义,如本例所示,但我希望将上述GetAddress方法同时包含在两个独立的组中,这些组对应于显示的两个路由前缀:
[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望在两者下列出相同的方法:
如何才能做到这一点?
顺便说一句,我正在使用ASP.NET Core(dnx46).如果还不能使用Swashbucklee的ASP.NET核心版本执行此操作,那么仍然可以欣赏完整的CLR(Web API 2.2?)示例.
另外,关于我正在尝试做的更完整的故事 - 我有一个单独的SO帖子.
@venerik给出的答案让我接近解决方案.当我申请他的示例代码时......
[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
Run Code Online (Sandbox Code Playgroud)
...这导致Swagger列表看起来像这样:
简而言之,"地址"端点现在出现在我想要的标题下,但正如红色箭头所示,它们现在也被"交叉列出"; 我不希望"订户"端点列在"组织"端点下.
我怀疑[SwaggerOperationFilter]可能是答案的"另一半",如果我可以删除交叉列表的条目.我之前没有玩过这种机制.
另外,非常不幸的是[SwaggerOperation]只能应用于方法/动作.我宁愿把它应用到类本身:
[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
public class AddressesController : Controller
{
Run Code Online (Sandbox Code Playgroud)
这有什么补救措施吗?