当前位置:首页 > Windows程序 > 正文

WebAPI上传大文件

2021-03-28 Windows程序

今天在研究WebAPI的上传与下载,作为Rest的框架,更多是面向资源,就其本身来说,是不会涉及也不应该涉及到大文件的处理,具体多大呢,也就是ASP.NET的限值2G。

ASP.NET的pipeline对于上传文件一般的处理流程是接收到文件,放到内存中,我们也一般只处理后续的流程,例如存入硬盘等等。

目前想象的一个场景是上传一个大文件,后续处理可能有多种。如果并发数过多,肯定会造成内存溢出,所以参考资料与琢磨,搞定了这个问题。

但是场景本身是有一定问题的,这纯属个人爱好在玩,真实场景来说文件不宜过大,不是专门处理大文件的服务器与协议,无非就是用流的方式,但是大文件传输使用流采用可靠协议是最好的,可靠不是指TCP的可靠,而是指在如果断开后,后续的处理,例如断点。

如果是HTTP的断点,那就只有自己写了。

一、配置文件修改

不多说,这个必须的。

1 <system.web> 2 <compilation debug="true" targetFramework="4.5" /> 3 <httpRuntime targetFramework="4.5" maxRequestLength="2147483647"/> 4 </system.web>

View Code

<security> <requestFiltering > <requestLimits maxAllowedContentLength="2147483647" ></requestLimits> </requestFiltering> </security>

View Code

二、扩展主机缓存Policy

这是微软预留的接口,作为扩展,让用户自己关闭主机是否缓冲,也就是正常流程中将上传文件的内容存入内存的动作

public class NoBufferPolicySelector : WebHostBufferPolicySelector { public override bool UseBufferedInputStream(object hostContext) { var context = hostContext as HttpContextBase; if (context != null) { if (context.Request.HttpMethod == HttpMethod.Post.ToString() && context.Request.ContentLength >200000) return false; } return true; }

View Code

还有个动作就是要去注册它

1 public static void Register(HttpConfiguration config) 2 { 3 // Web API 配置和服务 4 5 // Web API 路由 6 config.MapHttpAttributeRoutes(); 7 8 config.Routes.MapHttpRoute( 9 name: "DefaultApi", 10 routeTemplate: "api/{controller}/{id}", 11 defaults: new { id = RouteParameter.Optional } 12 ); 13 14 15 GlobalConfiguration.Configuration.Services.Replace(typeof(IHostBufferPolicySelector), new NoBufferPolicySelector()); 16 17 18 }

View Code

三、想怎么玩儿怎么玩儿

上传的代码,大家都懂的

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69321.html