Asp.net web api Swagger无法识别具有自定义属性[FromContent]的WebAPI控制器参数
我希望有一个自定义属性来将数据解析为流,并且可以通过Swagger进行测试 所以我创建了一个控制器,它从Asp.net web api Swagger无法识别具有自定义属性[FromContent]的WebAPI控制器参数,asp.net-web-api,swagger,swashbuckle,Asp.net Web Api,Swagger,Swashbuckle,我希望有一个自定义属性来将数据解析为流,并且可以通过Swagger进行测试 所以我创建了一个控制器,它从POSTbody读取: [大摇大摆的操作(“创建”)] [SwaggerResponse(HttpStatusCode.Created)] 公共异步任务发布([FromContent]Stream contentStream) { 使用(StreamReader=newstreamreader(contentStream,Encoding.UTF8)) { var str=reader.Rea
POST
body读取:
[大摇大摆的操作(“创建”)]
[SwaggerResponse(HttpStatusCode.Created)]
公共异步任务发布([FromContent]Stream contentStream)
{
使用(StreamReader=newstreamreader(contentStream,Encoding.UTF8))
{
var str=reader.ReadToEnd();
控制台写入线(str);
}
返回“OK”;
}
如何定义流以使其在Swagger UI中可见?
下面是我对FromContent
属性和ContentParameterBinding
绑定的实现:
公共类ContentParameterBinding:HttpParameterBinding
{
私有结构AsyncVoid{}
公共ContentParameterBinding(HttpParameterDescriptor描述符):基(描述符)
{
}
公共覆盖任务ExecuteBindingAsync(ModelMetadataProvider metadataProvider,
HttpActionContext操作上下文,
取消令牌(取消令牌)
{
var binding=actionContext.ActionDescriptor.ActionBinding;
如果(binding.ParameterBindings.Length>1||
actionContext.Request.Method==HttpMethod.Get)
{
var taskSource=new TaskCompletionSource
因此,我希望有相同的UI,但有我的自定义属性,让我有Stream
from content
使用“我的自定义”属性,参数显示时不带TextArea
,但可以使用邮递员进行测试并正确工作,并且Stream
可用
从类继承绑定:
尝试实现接口:
公共类ContentParameterBinding
:HttpParameterBinding,IValueProviderParameterBinding
{
公共IEnumerable valueProviderFactorys
{
得到
{
返回此.Descriptor.Configuration.Services.GetValueProviderFactorys();
}
}
}
对我来说,这很有帮助。
此外,它通常更干净,因为它不继承可能不需要的
FormatterParameterBinding
逻辑。您希望如何显示它?问题出在哪里?您应该澄清您是什么输出expecting@MegaTron我正在尝试为post添加测试,其中流是从内容体创建的,我将添加示例和图片在控制器方法中,为了避免执行var stream=wait this.Request.Content.ReadAsStreamAsync()
,整个参数绑定工作似乎要做很多工作。@Darreller,我是否错过了显示var stream=wait this.Request.Content.ReadAsStreamAsync()的正确方法
在swagger UI中?我不知道需要做什么来告诉Swashback您正在接受流。但是,当我们必须使代码更复杂以帮助驱动生成元数据的工具自动生成文档时,如果感觉我们做错了什么。感谢您的帮助!
public class ContentParameterBinding : FormatterParameterBinding
{
public ContentParameterBinding(HttpParameterDescriptor descriptor)
: base(descriptor,
descriptor.Configuration.Formatters,
descriptor.Configuration.Services.GetBodyModelValidator())
{
}
//your code
}