如何将自定义模型活页夹与Swashbuckle,Swagger和NSwag一起使用? [英] How to use a custom model binder with Swashbuckle, Swagger and NSwag?
问题描述
我有一个ASP.NET Core Web API,其中包含以下端点.
[HttpGet]
[Route("models/{ids}")]
[Produces(typeof(IEnumerable<Model>))]
public IActionResult Get
(
[ModelBinder(typeof(CsvModelBinder<string>))] IEnumerable<string> ids
)
{
// Get models
return Ok(models);
}
此终结点采用Id的CSV列表(例如/models/a,b,c
),并返回对应的Model
对象的JSON数组. CsvModelBinder<string>
是我编写的IModelBinder
的自定义实现,它将ID的CSV列表拆分为一个IEnumerable<string>
,可以在查询中使用它来查找对象.这一切都很好.
我现在想做的是使用NSwag生成客户端库,但这被证明是有问题的,因为Swashbuckle生成的Swagger将ids
参数描述为IEnumerable<string>
,而不是string
.>
选项A:是否可以告诉Swashbuckle将参数描述为string
而不是IEnumerable<string>
?
选项B:是否可以告诉NSwag在生成请求URL时应将此IEnumerable<string>
参数编组为CSV?
我知道了.我需要在Startup.cs中使用MapType()创建一个自定义模型
Csv.cs
public class Csv<T> : List<T> where T : IConvertible
{
public Csv<T> Append(string delimitedValues)
{
var splitValues = delimitedValues
.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Cast<string>();
var convertedValues = splitValues
.Select(str => Convert.ChangeType(str, typeof(T)))
.Cast<T>();
this.AddRange(convertedValues);
return this;
}
public override string ToString()
{
return this.Aggregate("", (a,s) => $"{a},{s}").Trim(',');
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSwaggerGen(c =>
{
c.IncludeXmlComments(() => new XPathDocument(new FileStream(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "MyApi.xml"), FileMode.Open)));
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1"});
c.MapType<Csv<string>>(() => new Schema { Type = "string", Format = "string" });
});
}
I have an ASP.NET Core Web API that contains the following endpoint.
[HttpGet]
[Route("models/{ids}")]
[Produces(typeof(IEnumerable<Model>))]
public IActionResult Get
(
[ModelBinder(typeof(CsvModelBinder<string>))] IEnumerable<string> ids
)
{
// Get models
return Ok(models);
}
This endpoint takes a CSV list of Ids (e.g. /models/a,b,c
) and returns a JSON array of the corresponding Model
objects. CsvModelBinder<string>
is a custom implementation of IModelBinder
I wrote that splits the CSV list of Ids into an IEnumerable<string>
that I can use in my query to go find the objects. This all works great.
What I'm now trying to do is generate a client library using NSwag, but this is proving problematic because Swashbuckle is generating Swagger that describes the ids
parameter as an IEnumerable<string>
, not a string
.
Option A: Is there a way to tell Swashbuckle to describe the parameter as a string
instead of as an IEnumerable<string>
?
Option B: Is there a way to tell NSwag that this IEnumerable<string>
parameter should be marshalled into a CSV when generating the request URL?
I figured it out. I needed to create a custom model use MapType() in Startup.cs
Csv.cs
public class Csv<T> : List<T> where T : IConvertible
{
public Csv<T> Append(string delimitedValues)
{
var splitValues = delimitedValues
.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Cast<string>();
var convertedValues = splitValues
.Select(str => Convert.ChangeType(str, typeof(T)))
.Cast<T>();
this.AddRange(convertedValues);
return this;
}
public override string ToString()
{
return this.Aggregate("", (a,s) => $"{a},{s}").Trim(',');
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSwaggerGen(c =>
{
c.IncludeXmlComments(() => new XPathDocument(new FileStream(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "MyApi.xml"), FileMode.Open)));
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1"});
c.MapType<Csv<string>>(() => new Schema { Type = "string", Format = "string" });
});
}
这篇关于如何将自定义模型活页夹与Swashbuckle,Swagger和NSwag一起使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!