在使用Swashbuckle上傳文件的時候,在接口文檔中希望看到上傳控件,但是C#中,沒有FromBodyAttribute這個特性,所以需要在運行時,修改參數的swagger屬性。
首先看下,最終效果:
下面介紹實現。
實現原理,通過swagger提供的filter,找到action中帶有SwaggerFileUpload特性的參數,然后給swagger operaion.parameters添加一個自定義的參數,即文件類型參數即可。
(1)
定義SwaggerFileUploadAttribute。
[AttributeUsage(AttributeTargets.Parameter)] public class SwaggerFileUploadAttribute : Attribute { public bool Required { get; private set; } public SwaggerFileUploadAttribute(bool Required = true) { this.Required = Required; } }
(2)
添加Filter。
/// <summary> /// swagger file upload parameter filter /// </summary> public class SwaggerFileUploadFilter : IOperationFilter { public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { var parameters = apiDescription.ActionDescriptor.GetParameters(); foreach (HttpParameterDescriptor parameterDesc in parameters) { var fileUploadAttr = parameterDesc.GetCustomAttributes<SwaggerFileUploadAttribute>().FirstOrDefault(); if (fileUploadAttr != null) { operation.consumes.Add("multipart/form-data"); operation.parameters.Add(new Parameter { name = parameterDesc.ParameterName + "_file", @in = "formData", description = "file to upload", required = fileUploadAttr.Required, type = "file" }); } } } }
(3)
給Swagger設置Filter。
(4)
Action中的參數設置特性,測試。
Public void TestSwaggerUploadFile([SwaggerFileUpload] file){ }
以上四部就可以實現文章開頭的效果了。
