为了实现这一点,您需要完成几个步骤。
首先,您需要告诉Swagger在请求body中包含二进制数据的参数。接下来,您需要告诉Swagger终端点使用二进制数据(例如application/octet-stream)。
Swashbuckle默认不支持此功能。但是您可以创建自定义过滤器来扩展Swashbuckle的功能。我通常的做法是创建一个自定义属性来装饰方法,然后创建一个自定义过滤器来处理该属性。
针对您的情况,以下内容将解决问题:
自定义属性:
public class BinaryPayloadAttribute : Attribute
{
public BinaryPayloadAttribute()
{
ParameterName = "payload";
Required = true;
MediaType = "application/octet-stream";
Format = "binary";
}
public string Format { get; set; }
public string MediaType { get; set; }
public bool Required { get; set; }
public string ParameterName { get; set; }
}
自定义过滤器
public class BinaryPayloadFilter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
var attribute = apiDescription.GetControllerAndActionAttributes<BinaryPayloadAttribute>().FirstOrDefault();
if (attribute == null)
{
return;
}
operation.consumes.Clear();
operation.consumes.Add(attribute.MediaType);
operation.parameters.Add(new Parameter
{
name = attribute.ParameterName,
@in = "body",
required = attribute.Required,
type = "string",
format = attribute.Format
});
}
}
将过滤器添加到Swashbuckle配置中
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.OperationFilter<BinaryPayloadFilter>();
});
将属性应用于您的方法
[HttpPost]
[BinaryPayload]
[Route("Store/{projectId}")]
public async Task Store(string projectId)
{
...
}
在Swagger UI中,您将获得以下内容:
请注意保留HTML标记。
[BinaryContent]
属性。 - Greg