具体的错误信息如下:
在线上遇到了文件上传问题,在测试环境试了好久都没有发现问题到底出在哪里,以为是服务器做了各种限制,然后一点思绪都没有。最后,尝试将线上的代码包拷贝一份,在测试环境运行,刚开始的时候以为是代码逻辑的问题,把bin.,content,script和view文件夹复制到测试环境运行了一下,没有问题啊。一脸懵,到底怎么回事呢,最后实在没有办法了,死马当活马医吧(最开始,坚决否认是配置文件的问题,因为代码包自己打包的,所以,觉得不会存在问题的),比较一下线上的webconfig和线下的有什么不一样吧,解决发现了问题:
线上的缺少如下配置(在system.webServer 节点下进行配置):
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1073741824"/>
</requestFiltering>
</security>
然后将本地的这些代码注释掉,运行了一下,上传了一个不算大的压缩文件,果然出现了问题。不过线上由于屏蔽了错误信息,所以只返回了404错误,线下的调试。很明显的就看出问题了。
其实,错误信息中很明确的写明了应该是哪里的问题,应该怎样操作。但是,其实线上我配置了好几个属性,但是一直不理解之间的关联和区别。正好借着这个问题好好的梳理一下:
maxRequestLength与 maxReceivedMessageSize 和 maxAllowedContentL之间的关联和区别
<!--配置asp.net http运行库的设置。可以在计算机,站点,应用程序和子目录级别声明
允许最多的请求个数100,最长允许执行请求时间为80秒,控制用户上传文件的大小,默认是4M。useFullyQualifiedRedirectUrl客户端重定向不需要被自动转换为完全限定格式。-->
<httpRuntime appRequestQueueLimit="100" executionTimeout="80" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>
设置最大文件请求,需要在配置文件里面设置文件上传限定的两个属性值:maxAllowedContentLength,maxRequestLength 允许上传文件的长度,和请求的长度,两个大小需要设置一致,如果不一致,则以请求长度为准。
The maximum request size in kilobytes. The default size is 4096 KB (4 MB). 默认请求长度只有4M. 设置的单位都为byte
<system.web>
<httpRuntime maxRequestLength="2147483647" executionTimeout="36000" delayNotificationTimeout="36000"/>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483648"/>
</requestFiltering>
</security>
</system.webServer>