Skip to main content
 首页 » 编程设计

c#之模型绑定(bind)不适用于 asp.net core web api Controller 操作方法中的 Stream 类型参数。(即使使用自定义流输入格式)

2024年04月12日33lyj

我想将文件上传到 asp net core web api Controller 操作方法。我发送的内容类型为“application/octet-stream”。我创建了名为 StreamInputFormatter 的自定义输入格式化程序。正在调用 streaminputformatter,但未调用 Controller 中的操作方法?并且我得到的错误是

“InvalidOperationException:此流不支持超时。”

流输入格式器:

public class StreamInputFormatter : IInputFormatter 
    { 
        public bool CanRead(InputFormatterContext context) 
        { 
            if (context == null) 
            { 
                throw new ArgumentNullException(nameof(context)); 
            } 
            var contentType = context.HttpContext.Request.ContentType; 
            if (contentType == "application/octet-stream") 
            { 
                return true; 
            } 
            return false; 
        } 
 
        public Task<InputFormatterResult> ReadAsync(InputFormatterContext context) 
        { 
            if (context == null) 
            { 
                throw new ArgumentNullException(nameof(context)); 
            } 
 
 
            var memoryStream = new MemoryStream(); 
            context.HttpContext.Request.Body.CopyTo(memoryStream); 
 
            return InputFormatterResult.SuccessAsync(memoryStream); 
        } 
    } 

Controller 操作方法:

        [HttpPost("{documentType}")] 
        public async Task<IActionResult> CreateJob(string documentType, [FromBody]Stream template) 
        { 
 
        } 

请您参考如下方法:

听起来您收到此错误是因为 DefaultObjectValidator 遍历了您不受支持的 Stream 属性(请参阅 issue 了解一些信息)。

要跳过 Stream 模型验证,您可以添加

        services.AddMvc(options => 
        { 
            ... 
 
            options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Stream))); 
        }); 

根据您的配置。