4

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

  <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 的文件,并且我的上传工作正常。

4

3 回答 3

0

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

1 Mb = 1024kb

正如您可以在以下位置看到更多详细信息:

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

所以当你设置 maxRequestLength="330" 时,系统会理解文件上传是限制为 330kb。

于 2016-02-22T03:46:12.460 回答
0

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

如何允许所有用户访问具有集成身份验证的网站中的一条路由?

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

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

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

于 2016-02-22T13:43:00.200 回答
0

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

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

于 2016-02-22T12:31:56.407 回答