为什么超过指定maxRequestLength的请求会响应(看似)不相关的错误?

时间:2016-02-12 13:41:09

标签: asp.net-mvc-4 web-config maxrequestlength http-status-code-500

我已经在我的web.config(MVC)中指定了maxRequestLength,如下所示:

  <location path="File/Upload">
    <system.web>
      <httpRuntime maxRequestLength="330"/>
    </system.web>
  </location>

在测试超过330kb的文件上传时查看网络标签时,我看到服务器的响应为500,详情为The required anti-forgery form field &quot;__RequestVerificationToken&quot; is not present.

为什么会这样?框架是否无法在响应中提供maxRequestLength的详细信息?或者仅仅是为了不泄露有关系统的信息它只是不想要?

或者我的请求是否已被截断/裁剪以满足限制,这无意中删除了请求验证令牌?

这适用于不超过330kb的文件,我的上传工作正常。

3 个答案:

答案 0 :(得分:0)

我看到你设置的maxRequestLength是330,这是文件上传的限制。 此值遵循以下规则:

1 Mb = 1024kb

您可以在以下网址查看更多详细信息:

https://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.maxrequestlength(v=vs.110).aspx

因此,当您设置maxRequestLength =&#34; 330&#34;时,系统将理解文件上传限制为330kb。

答案 1 :(得分:0)

我怀疑您的某个操作(不一定是处理文件上传的操作)具有[ValidateAntiForgeryToken]属性,并且您正在以某种方式看到来自该操作的错误。

我建议暂时注释掉项目中的所有[ValidateAntiForgeryToken]属性,以便在尝试上传超出限制的文件时查看实际返回的内容。

答案 2 :(得分:0)

我尝试在示例项目上重新创建问题,但经过进一步研究,我发现ASP.NET MVC控制器操作不使用web.config文件中的location元素。这是因为与将文件映射到磁盘的ASP.NET不同,ASP.NET MVC使用路由。您可以在下面的链接中查看答案,尽管与其他问题有关,但请注意未使用位置标记。

How do I allow all users access to one route within a website with integrated auth?

在这种情况下,框架很可能无法对Upload操作的文件大小强制实施限制。

我不能完全确定,因为我无法重新创建500内部服务器错误,但我认为这可能是因为框架因位置元素而无法正确解释您的web.config。

关于防伪令牌的错误,请确保它存在于您的视图中(通过使用 @ Html.AntiForgeryToken())并且在您提交之前没有脚本将其从DOM中删除表格