.net core 我如何告诉Swashbuckle 5 dotnetcore 3.0中需要正文内容?

.net core 我如何告诉Swashbuckle 5 dotnetcore 3.0中需要正文内容?,.net-core,swagger,swagger-ui,swashbuckle,asp.net-core-3.0,.net Core,Swagger,Swagger Ui,Swashbuckle,Asp.net Core 3.0,我正在尝试实现Swashback 5,我有两个方法可以读取请求体,如下所示: var requestBody = await Request.GetRawBodyStringAsync(); 我如何告诉Swashback/Swagger将其作为参数读取,以便人们可以测试我的API?我看到了一个非常好的例子,但那是针对二进制内容和早期版本的Swashback 任何帮助都将不胜感激 正如您在Swashback 5中已经发现的,它是不同的,因为它切换到使用。这就是对象模型不同的原因。否则,它的工作方

我正在尝试实现Swashback 5,我有两个方法可以读取请求体,如下所示:

var requestBody = await Request.GetRawBodyStringAsync();
我如何告诉Swashback/Swagger将其作为参数读取,以便人们可以测试我的API?我看到了一个非常好的例子,但那是针对二进制内容和早期版本的Swashback


任何帮助都将不胜感激

正如您在Swashback 5中已经发现的,它是不同的,因为它切换到使用。这就是对象模型不同的原因。否则,它的工作方式仍然与您链接的帖子中的示例相同。我已将该案例转换为您希望发送原始文本字符串的场景

创建自定义属性以标记读取原始字符串的方法。例如:

public class RawTextRequestAttribute : Attribute
{
   public RawTextRequestAttribute()
   {
      MediaType = "text/plain";
   }

   public string MediaType { get; set; }
}
要修改招摇过市定义,您需要一个将检查此属性的函数,如果找到,则将请求主体自定义为普通字符串。下面是一个实现示例:

public class RawTextRequestOperationFilter : IOperationFilter
{
   public void Apply(OpenApiOperation operation, OperationFilterContext context)
   {
      RawTextRequestAttribute rawTextRequestAttribute = context.MethodInfo.GetCustomAttributes(true)
         .SingleOrDefault((attribute) => attribute is RawTextRequestAttribute) as RawTextRequestAttribute;
      if (rawTextRequestAttribute != null)
      {
         operation.RequestBody = new OpenApiRequestBody();
         operation.RequestBody.Content.Add(rawTextRequestAttribute.MediaType, new OpenApiMediaType() 
         {
            Schema = new OpenApiSchema()
            {
               Type = "string"
            }
         });
      }
   }
}
对于要使用的过滤器,您需要在配置Swagger时在启动时注册它

public void ConfigureServices(IServiceCollection services)
{
   services.AddControllers();
   services.AddSwaggerGen(c =>
   {
      c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
      c.OperationFilter<RawTextRequestOperationFilter>();
   });
}
结果是,您在Swagger UI中获得了请求主体的文本输入框


您是否能够删除生成的请求正文中的字符串关键字?您是指输入框中显示的默认值?在
OpenApiSchema
对象上有一个
Default
属性,我认为它指定了默认显示的值。我尝试了默认属性,但没有任何区别。您可以使用
示例
属性来更改它。显示的示例值是错误的默认值。例如,要获得空字符串值,您可以设置
example=newOpenAPIString(“”)
谢谢您的修复!
[HttpPost]
[RawTextRequest]
public async Task Post()
{
   var requestBody = await Request.GetRawBodyStringAsync();
   _logger.LogDebug(requestBody);
}