调用HttpRequest.GetBufferlessInputStream后request.Files不支持问题求助
问题描述
- 技术栈:ASP.NET Framework 4.6.1、Microsoft.AspNet.WebApi 5.2.7、Entity Framework 6.4
- 错误现象:调用
request.Files时触发异常,错误提示:
This method or property is not supported after HttpRequest.GetBufferlessInputStream has been invoked
- 相关WebApiConfig配置代码:
public static class WebApiConfig { [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1062:Validate arguments of public methods", Justification = "<Pending>")] public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "ActionApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); //Enable cross domain request EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(cors); config.Filters.Add(new ErrorHandlers.AiHandleErrorAttribute()); config.Filters.Add(new UploadFileFilterAttribute()); config.MessageHandlers.Add(new RequestTabletMessageHandler()); config.MessageHandlers.Add(new RequestLoggingMessageHandler()); config.Services.Add(typeof(IExceptionLogger), new CustomExceptionLogger()); } }
解决方案
这个错误的核心原因是请求流被提前读取或修改:GetBufferlessInputStream会直接获取无缓冲的请求流,之后ASP.NET不再允许通过request.Files这类依赖缓冲的方式访问请求内容。
针对你的配置,可按以下方向修复:
排查MessageHandler的流操作
- 检查
RequestLoggingMessageHandler和RequestTabletMessageHandler,如果其中调用了GetBufferlessInputStream或直接读取了Request.Content流,会导致后续request.Files无法访问。 - 修改逻辑:若需要记录请求内容,读取流后要重新包装并赋值给
Request.Content,比如用MemoryStream保存读取的字节,再设置回请求对象,确保后续组件能正常访问流。
- 检查
调整过滤器执行顺序或逻辑
- 检查
UploadFileFilterAttribute,如果过滤器提前操作了请求流,也会触发该错误。 - 可尝试将过滤器的注册顺序调整到MessageHandlers之后,或修改过滤器内的逻辑,避免提前消耗请求流。
- 检查
改用Web API标准文件上传方式
- 放弃
request.Files,使用MultipartFormDataStreamProvider处理文件上传,示例代码:public async Task<IHttpActionResult> UploadFile() { if (!Request.Content.IsMimeMultipartContent()) { return BadRequest("不支持的媒体类型"); } var tempPath = Path.GetTempPath(); var provider = new MultipartFormDataStreamProvider(tempPath); await Request.Content.ReadAsMultipartAsync(provider); // 遍历处理上传的文件 foreach (var fileData in provider.FileData) { var originalFileName = provider.Headers.ContentDisposition.FileName.Trim('"'); var localFilePath = fileData.LocalFileName; // 此处添加文件保存或业务处理逻辑 } return Ok("文件上传完成"); }
- 放弃
内容的提问来源于stack exchange,提问作者Nguyễn Văn Quang
相关产品推荐
相关产品推荐

