是否有人成功地为swagger5.0构建了一个文件过滤器?
我现在有一个用于Swashbuckle.AspNetCore 4.0.1:src=template
但是,由于我迁移到NetCore3.0,我需要将我的swagger更新为5.0。我的FileFilter需要补充,但是我未能成功地迁移文件过滤器。有人能帮忙吗?
用于swagger 4.0.1的当前工作SwaggerUploadFileFilter:
public class SwaggerUploadFileFilter : IOperationFilter
{
private const string formDataMimeType = "multipart/form-data";
private static readonly string[] formFilePropertyNames =
typeof(IFormFile).GetTypeInfo().DeclaredProperties.Select(p => p.Name).ToArray();
public void Apply(Operation operation, OperationFilterContext context)
{
var parameters = operation.Parameters;
if (parameters == null || parameters.Count == 0) return;
var formFileParameterNames = new List<string>();
var formFileSubParameterNames = new List<string>();
foreach (var actionParameter in context.ApiDescription.ActionDescriptor.Parameters)
{
var properties =
actionParameter.ParameterType.GetProperties()
.Where(p => p.PropertyType == typeof(IFormFile))
.Select(p => p.Name)
.ToArray();
if (properties.Length != 0)
{
formFileParameterNames.AddRange(properties);
formFileSubParameterNames.AddRange(properties);
continue;
}
if (actionParameter.ParameterType != typeof(IFormFile)) continue;
formFileParameterNames.Add(actionParameter.Name);
}
if (!formFileParameterNames.Any()) return;
var consumes = operation.Consumes;
consumes.Clear();
consumes.Add(formDataMimeType);
foreach (var parameter in parameters.ToArray())
{
if (!(parameter is NonBodyParameter) || parameter.In != "formData") continue;
if (formFileSubParameterNames.Any(p => parameter.Name.StartsWith(p + "."))
|| formFilePropertyNames.Contains(parameter.Name))
parameters.Remove(parameter);
}
foreach (var formFileParameter in formFileParameterNames)
{
parameters.Add(new NonBodyParameter()
{
Name = formFileParameter,
Type = "file",
In = "formData"
});
}
}
}尝试使用在线代码为swagger5.0设置代码:
public class SwaggerUploadFileFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (!(operation?.RequestBody?.Content?.Any(x => x.Key.ToLower() == "multipart/form-data") ?? false)) return;
var uploadFiles = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
.Union(context.MethodInfo.GetCustomAttributes(true))
.OfType<SwaggerUploadFile>();
if (uploadFiles.Count() == 0) return;
var uploadFile = uploadFiles.First();
operation.RequestBody.Content["multipart/form-data"].Schema.Properties =
new Dictionary<string, OpenApiSchema>
{
[uploadFile.Parameter] = new OpenApiSchema
{
Type = "string",
Format = "binary",
Description = uploadFile.Description
}
};
if (!string.IsNullOrEmpty(uploadFile.Example))
{
operation.RequestBody.Content["multipart/form-data"].Schema.Example = new OpenApiString(uploadFile.Example);
operation.RequestBody.Content["multipart/form-data"].Schema.Description = uploadFile.Example;
}
}
private class SwaggerUploadFile
{
public string Parameter { get; set; }
public string Description { get; set; }
public string Example { get; set; }
}
}我在使5.0版本与IFormFile一起工作时遇到了困难。
如能提供任何协助,我们将不胜感激。
发布于 2019-11-11 06:00:02
5.0-rc4应该与没有自定义操作过滤器的文件一起工作--如果您有一个[FromForm]参数属性,您只需要删除它。
在GitHub问题讨论中指定并测试了自己。
https://stackoverflow.com/questions/58768489
复制相似问题