从swagger docs人开始:
ApiExplorer
(Swashbakle构建在其上的ASP.NET核心元数据组件)默认情况下不呈现FileResult
类型,因此您需要使用Products属性显式地告诉它:
[HttpGet("{fileName}")]
[Produces("application/octet-stream", Type = typeof(FileResult))]
public FileResult GetFile(string fileName)
PushStreamHttpResult
也是文件结果,似乎同样的规则也适用于它,因此您可以使用Produces
调用,例如:
app.MapGet("api/test", async Task<Results<PushStreamHttpResult, NotFound>> (bool fail) =>
.WithSummary("Test Streaming results")
.Produces(200, contentType: "text/plain" )
如果所有PushStreamHttpResult
个都是纯文本,那么您可以try 使用操作Filter将其自动化:
// sample implementation, adjust for production
public sealed class PushStreamHttpResultFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var returnType = context.MethodInfo.ReturnType;
if (ContainsPushStream(returnType))
{
// adds plain text only if no 200 are defined
operation.Responses.TryAdd("200", new OpenApiResponse
{
Content = new Dictionary<string, OpenApiMediaType>
{
["text/plain"] = new OpenApiMediaType()
{
Schema = new OpenApiSchema()
}
}
});
}
bool ContainsPushStream(Type type)
{
if (type == typeof(PushStreamHttpResult))
return true;
if (!type.IsConstructedGenericType)
return false;
if (type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(Task<>))
return ContainsPushStream(type.GetGenericArguments()[0]);
return type.GetGenericArguments().Any(t => t == typeof(PushStreamHttpResult));
}
}
}
并将其添加到过滤器中:
builder.Services.AddSwaggerGen(o =>
{
o.OperationFilter<PushStreamHttpResultFilter>();
});