C# 使用SwashFilter设置输入参数的默认描述

C# 使用SwashFilter设置输入参数的默认描述,c#,httprequest,asp.net-core-webapi,swagger-2.0,swashbuckle,C#,Httprequest,Asp.net Core Webapi,Swagger 2.0,Swashbuckle,我想在文档的模式中为DateTime类型的所有输入参数添加默认描述。因此,客户将了解我们使用的格式等 我可以为此目的创建ISchemaFilter的自定义实现吗 我知道我可以通过使用xml注释添加描述,但在这种情况下,我应该在许多按日期筛选的地方复制并粘贴相同的文本 我已尝试使用MapType进行此操作。但据我所知,它只适用于响应类型(至少在我的情况下,它只适用于响应模型)。但仍然没有答案 options.MapType<DateTime> (() => new Schema

我想在文档的模式中为DateTime类型的所有输入参数添加默认描述。因此,客户将了解我们使用的格式等

我可以为此目的创建ISchemaFilter的自定义实现吗

我知道我可以通过使用xml注释添加描述,但在这种情况下,我应该在许多按日期筛选的地方复制并粘贴相同的文本

我已尝试使用MapType进行此操作。但据我所知,它只适用于响应类型(至少在我的情况下,它只适用于响应模型)。但仍然没有答案

options.MapType<DateTime> (() => new Schema {
  Type = "string",
  Format = "date-time",
  Description = "Description"
});
options.MapType(()=>新架构{
Type=“string”,
Format=“日期时间”,
Description=“Description”
});
我还尝试了自定义DateTimeSchemaFilter,但没有为输入参数添加任何说明。我已经尝试了不使用xml和/或MapType的配置。在调试模式下,我看到正在调用我的过滤器,但在UI中什么也没发生

public class DateTimeSchemaFilter: ISchemaFilter {

    public void Apply(Schema schema, SchemaFilterContext context) 
    {
        var typeInfo = context.SystemType;
        if (typeInfo == typeof(DateTime ? )) 
        {
            schema.Description = "Description";
        }
    }
}

services.AddSwaggerGen(options => {

    options.DescribeAllEnumsAsStrings();

    var xmlFile = $ {Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
    options.IncludeXmlComments(xmlPath);

    options.MapType<DateTime> (() => new Schema {
        Type = "string",
        Format = "date-time",
        Description = "Description"
    }); 

    options.SchemaFilter<DateTimeSchemaFilter>();

});

public async Task<IActionResult> GetTelemetries(
        string nodeId, 
        int offset = 0, 
        int limit = DEFAULT_PAGE_LIMIT,
        TelemetryChannel channel = TelemetryChannel.Temperature,
        DateTime? dateFrom = null,
        DateTime? dateTo = null)
    {
        var result = await _telemetryService.GetTelemetries(nodeId, offset, limit);

        return BaseResponse(result);
    }
公共类DateTimeSchemaFilter:ISchemaFilter{
public void Apply(架构、SchemaFilterContext上下文)
{
var typeInfo=context.SystemType;
if(typeInfo==typeof(DateTime?)
{
schema.Description=“Description”;
}
}
}
services.AddSwaggerGen(选项=>{
options.descripbeAllenumsasstrings();
var xmlFile=${Assembly.getExecutionGassembly().GetName().Name}.xml”;
var xmlPath=Path.Combine(AppContext.BaseDirectory,xmlFile);
选项。includexmlcoments(xmlPath);
options.MapType(()=>新架构{
Type=“string”,
Format=“日期时间”,
Description=“Description”
}); 
options.SchemaFilter();
});
公共异步任务getElemetries(
字符串nodeId,
int offset=0,
int limit=默认的页面限制,
遥测通道=遥测通道温度,
DateTime?dateFrom=null,
DateTime?dateTo=null)
{
var结果=等待遥测服务.GetTelemetries(节点ID、偏移量、限制);
返回BaseResponse(结果);
}

如果您有自定义架构筛选器

public class DateTimeSchemaFilter: ISchemaFilter {

    public void Apply(Schema schema, SchemaFilterContext context) 
    {
        var typeInfo = context.SystemType;
        if (typeInfo == typeof(DateTime ? )) 
        {
            schema.Description = "Description";
        }
    }
}
…您可以使用此批注注册它:

[SwaggerSchemaFilter(typeof(DateTimeSchemaFilter))]
public class YourModel
{
    public int Description { get; set; }
}
注释可作为NuGet软件包提供:

您需要在swagger generator(Startup.cs)中注册注释:


我也遇到了同样的问题——我设置了一个
ISchemaFilter
来填充描述(在我的例子中,我是基于属性的存在来完成的)

我可以看到我的过滤器被调用,描述被设置,但是当我查看SwaggerUI/OpenAPI规范文件时,描述丢失了

事实证明,它被包含XML注释的代码搞砸了

foreach(新[]{typeof(SomeType).assembly中的var assembly,typeof(AnotherType.assembly})
{
var filePath=Path.Combine(AppContext.BaseDirectory,$“{assembly.GetName().Name}.xml”);
c、 includexmlcoments(filePath,true);
}
当我将模式过滤器注册转移到XmlComments之后(它隐式地添加了一个模式过滤器)时,一切都按照我的预期工作


注意:更新描述时要小心,可能您希望附加到它(如果非空)而不是覆盖它。

我知道注释,但它仅适用于作为输入参数的模型。因此,如果我将过滤器按日期移动到遥测选项(例如)类并将在API端点中使用它作为输入参数,而不是当前参数(dateFro,dateTo)。它将工作得很好(感谢您指出在启动时应启用注释)。但我希望在查询中包含所有输入参数(请查看我的API端点示例)。在这种情况下,注释将不起作用(它仅适用于类)。我可以通过xml注释添加描述。但如果可能的话,我想找到更优雅的方法
services.AddSwaggerGen(x =>
{
   x.EnableAnnotations();
});