ASP.NET Core中调整HTTP请求大小的几种方法详解
一、前言
之所以称asp.net core是一个web开发平台,源于它具有一个极具扩展性的请求处理管道,我们可以通过这个管道的定制来满足各种场景下的http处理需求。asp. net core应用的很多特性,比如路由、认证、会话、缓存等,也同时定制消息处理管道来实现的。我们甚至可以通过管道定制在asp.net core平台上创建我们自己的web框架,实际上mvc和singalr这两个重要的web框架也是采用这样的方式创建的。
http协议自身的特性决定了任何一个web应用的工作方式都是监听、接收并处理http请求,并在最终对请求予以响应,http请求处理是管道式设计典型的应用场景。我们根据http请求的处理流程定制出一个消息处理管道,让接收到的http请求消息想水一样流入这个管道,组成这个管道的各个环节一次对它作相应的处理。处理的结果同样转变成消息逆向流入这个管道进行处理,并最终转变成回复给客户端的http响应。
一般的情况下,我们都无需调用http请求的大小,只有在上传一些大文件,或者使用http协议写入较大的值时(如调用webservice)才可能会调用http最大请求值。
在asp.net core 2.0中,它的两个宿主服务器kestrel和httpsys默认的http最大请求大小为30mb (~28.6 mib)。
如果当http请求值大于这个默认配置时,在执行request.body.readasync方法时,就会引发ioexception异常。如果这个异常未被捕获,在kestrel服务器中输出http状态码413(request entity too large), 而在httpsys 中的http状态码将是500(internal server error)。
二、解决方案
在asp.net core中这个配置可以基于全局和每次请求进行配置。
1.mvc的解决方案
mvc core中为我们提供了两种特性配置请求大小:
requestsizelimit attribute,对每个action的请求大小进行配置。如下调整myaction的请求大小值为100,000,000 字节.
[httppost] [requestsizelimit(100_000_000)] public iactionresult myaction([frombody] myviewmodel data) { }
disablerequestsizelimit attribute可以同时应用到controller和action上,以禁用对http请求的大小限制,也是说设置为无限制。
[httppost] [disablerequestsizelimit] public iactionresult myaction([frombody] myviewmodel data) { }
2.请求上下文的解决方案
这个方案是一个全局配置方案,会影响到每个请求,当然也可以通过一些灵活的配置对单个请求进行修改,它通过ihttpmaxrequestbodysizefeature 特征进行配置。如下在httpcontext中取得,当然也可以在applicationservices的ioc中获取。
httpcontext.features.get<ihttpmaxrequestbodysizefeature>().maxrequestbodysize = 100_000_000;
ihttpmaxrequestbodysizefeature特征的maxrequestbodysize属性是nullable< long >类型,当设置为null时,类拟于mvc中的[disablerequestsizelimit]]。isreadonly属性说明此时上下文中的请求大小是否可以修改。
3.全局配置解决方案
通过两个宿主服务器kestrel和httpsys配置对请求大小进行修改,规则与前两种方案相同。
.usekestrel(options => { options.limits.maxrequestbodysize = null; }
.usehttpsys(options => { options.maxrequestbodysize = 100_000_000; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。