首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为ASP.NET核心中的未绑定参数添加swagger参数

为ASP.NET核心中的未绑定参数添加swagger参数
EN

Stack Overflow用户
提问于 2021-02-18 16:30:11
回答 2查看 386关注 0票数 2

我有一个ASP.NET核心2.2的WebApi,并希望上传一些额外的元数据的大文件。请求是一个多部分/表单数据。因为要上传的文件可能会非常大,所以我不想将其读取到内存中进行处理,而是直接将其流式传输到其所需的目的地。我遵循了文档为了禁用表单值模型绑定,我还调整了端点的最大请求大小。

我已经用postman测试了端点,它可以正常工作:

然而,Swagger显然没有意识到请求应该有参数。如何在不定义方法签名中的参数的情况下将这些参数添加到swagger文档中?

我的端点如下所示:

代码语言:javascript
运行
复制
[HttpPost]
[DisableFormValueModelBinding]
[DisableRequestSizeLimit]
public async Task Upload() // "department" and "file" needed in the multipart/form-data
{
  // var path = await uploader.UploadAsync(Request);
  // return Ok(path);
}

通常,我会像下面这样绑定参数:

代码语言:javascript
运行
复制
public async Task Upload([FromForm] string department, [FromForm] IFormFile file)

这在Swagger中可以正常工作,但如上所述,我不想绑定参数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-23 01:15:29

对于Swashbuckle.AspNetCore版本5和更高版本,有些东西已经改变了。

要像Alexander在他的答案中那样提供参数,代码将类似于以下内容:

代码语言:javascript
运行
复制
operation.Parameters.Add(new OpenApiParameter()
{
    Name = "department",
    Schema = new OpenApiSchema { Type = "string", Format = "string" },
    Required = true,
});

operation.Parameters.Add(new OpenApiParameter()
{
    Name = "file",
    Schema = new OpenApiSchema { Type = "string", Format = "binary" },
    Required = true,
});

但是,由于某些原因(我没有进一步研究),我无法使用这种方法在Swagger UI中执行调用。

最后,下面的示例给出了我想要的结果:

代码语言:javascript
运行
复制
public class AddUnboundParametersOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var descriptor = context.ApiDescription.ActionDescriptor as ControllerActionDescriptor;
    
        if (descriptor != null && descriptor.ControllerTypeInfo == typeof(RemoteUpdateController) && descriptor.ActionName == nameof(RemoteUpdateController.Upload))
        {
            var openApiMediaType = new OpenApiMediaType
            {
                Schema = new OpenApiSchema
                {
                    Type = "object",
                    Required = new HashSet { "department", "file" }, // make the parameter(s) required if needed
                    Properties = new Dictionary
                    {
                        { "department" , new OpenApiSchema() { Type = "string", Format = "string" } },
                        { "file" , new OpenApiSchema() { Type = "string", Format = "binary" } },
                    }
                }
            };

            operation.RequestBody = new OpenApiRequestBody
            {
                Content = new Dictionary
                {
                    { "multipart/form-data", openApiMediaType }
                }
            };
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-02-20 09:42:49

您可以使用IOperationFilter为了这个。添加以下类,调整控制器和动作名称

代码语言:javascript
运行
复制
public class AddUnboundParametersOperationFilter : IOperationFilter
{
    public void Apply(Operation operation, OperationFilterContext context)
    {
        if (operation.Parameters == null)
            operation.Parameters = new List();

        var descriptor = context.ApiDescription.ActionDescriptor as ControllerActionDescriptor;

        if (descriptor != null && descriptor.ControllerTypeInfo == typeof(TestController) && descriptor.ActionName == nameof(TestController.Upload))
        {
            operation.Parameters.Add(new NonBodyParameter()
            {
                Name = "department",
                Type = "string",
                Required = true,
                In = "formData",
            });

            operation.Parameters.Add(new NonBodyParameter()
            {
                Type = "file",
                In = "formData",
                Name = "file",
                Required = true
            });
        }
    }
}

在Startup.cs

代码语言:javascript
运行
复制
services.AddSwaggerGen(c =>
{
    c.OperationFilter();
    //...
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66256229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档