在大文件上传时返回400而不是404

时间:2015-01-16 17:02:26

标签: c# asp.net iis asp.net-web-api

我正在使用.Net WebApi构建应用程序。我有一个上传文件的端点,我已经设置了web.config,如下所示:

<httpRuntime targetFramework="4.5" maxRequestLength="300000" />

<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="305000000" />
  </requestFiltering>
</security>

目前,如果我上传的文件大于〜300Mb,则会返回404.13状态代码。但是,我想返回400而不是。我相信404本身就是在抛出它,因为无论我在代码中做什么,我都无法捕获异常。我已经尝试了以下内容:

实现ExceptionHandler:http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

实施Application_Error:Catching "Maximum request length exceeded"

实施Application_BeginRequest:http://geekswithblogs.net/sglima/archive/2011/09/20/how-to-handle-maximum-request-length-exceeded-exception.aspx

在try catch中围绕控制器激活器:http://blog.greatrexpectations.com/2013/05/15/exception-handling-for-web-api-controller-constructors/

在web.config中替换404.13错误:

<httpErrors errorMode="Custom">
  <remove statusCode="404" subStatusCode="13" />            
  <error statusCode="404" subStatusCode="13" path="/errors/filesize" responseMode="Redirect" />   
</httpErrors>

实施DelegatingHandler:Exception Handling ASP.NET MVC Web API

似乎没有任何作用,我尝试在上述任何方法的开头设置断点,并且在抛出异常时它永远不会进入任何一个。

1 个答案:

答案 0 :(得分:0)

您可以在Global.asax.cs中尝试:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    if (Request.ContentLength > N) // set the N to the maximum allowed value
    {
        Response.StatusCode = 400;
        Response.End();
    }
}

请注意ContentLength是指整个请求体长。如果这不起作用,请尝试使用Request.Headers [“Content-Length”]而不是Request.ContentLength(可能会计算请求完全到达服务器后的长度)。此外,您可以强制您的消费者为某些请求发送Content-Length标头,例如:

// your condition might be based on the request URI if you don't 
// use a different Content-Type for your file upload method in web api
if (Request.Headers["Content-Type"] != null &&
    Request.Headers["Content-Type"].StartsWith("multipart/form-data;"))
{
    if(Request.Headers["Content-Length"] == null)
    {
        Response.StatusCode = 400;
        Response.End();
    }
}