WebAPI上传大文件
今天在研究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