尝试使用 HttpClient 上传文件时来自 Web Api 的 RequestEntityTooLarge 响应

Posted

技术标签:

【中文标题】尝试使用 HttpClient 上传文件时来自 Web Api 的 RequestEntityTooLarge 响应【英文标题】:RequestEntityTooLarge response from Web Api when trying to upload a file with HttpClient 【发布时间】:2014-11-03 09:07:59 【问题描述】:

我正在尝试使用 Asp.Net Web Api 创建一个通过 Post 上传文件的 Web 服务。这些分别是 Client 和 Web Api 的实现:

客户:

using (var client = new HttpClient()) 
    client.BaseAddress = new Uri("https://127.0.0.1:44444/");
    using (var content =
       new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture))) 
       content.Add(new ByteArrayContent(File.ReadAllBytes(filepath)));
       content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
       var response = await client.PostAsync("api/Synchronization", content);

       if (response.IsSuccessStatusCode)
           eventLog1.WriteEntry("Synchronization has been successful", EventLogEntryType.Information);
       else 
           eventLog1.WriteEntry(response.StatusCode + ":" + response.ReasonPhrase, EventLogEntryType.Error);

      

服务器:

public class SynchronizationController : ApiController 

    public HttpResponseMessage SynchronizeCsv() 
        var task = this.Request.Content.ReadAsStreamAsync();
        task.Wait();
        Stream requestStream = task.Result;

        try 
            Stream fileStream = File.Create(HttpContext.Current.Server.MapPath(path));
            requestStream.CopyTo(fileStream);
            fileStream.Close();
            requestStream.Close();
        
        catch (IOException) 
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "A generic error occured. Please try again later.");
        

        HttpResponseMessage response = new HttpResponseMessage();
        response.StatusCode = HttpStatusCode.Created;
        return response;
    

Web.config:

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" maxRequestLength="2097152" />
  </system.web>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483648" />
      </requestFiltering>
    </security>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

我正在尝试上传一个 5Mb 的文件,每次尝试调用该服务时,都会收到 413 Http Error Request Entity Too Large。如果文件很小(例如 40kb),一切正常。

浏览互联网,我尝试对 web.config 进行一些修改,但似乎没有任何工作正常。我做错了什么?

【问题讨论】:

【参考方案1】:

我通过这个解决方案解决了这个问题:http://www.smartdigitizers.com/net-development-tips/iis-7-how-to-resolve-error-https-413-request-entity-too-large/

    启动“Internet 信息服务 (IIS) 管理器” 选择您在其下托管 Web 应用程序的站点。 在功能部分,双击“配置编辑器” 在“部分”下选择:system.webServer 然后 serverRuntime 将“uploadReadAheadSize”部分修改为 20MB(以字节为单位的值) 点击应用

【讨论】:

以上是关于尝试使用 HttpClient 上传文件时来自 Web Api 的 RequestEntityTooLarge 响应的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpClient 上传多部分表单文件

采用HttpClient3.x上传文件 spring 文件上传

HttpClient:如何一次上传多个文件

网络条件差时如何处理文件HttpClient.PostAsync文件上传?

Titanium HTTPCLIENT 无法上传文件

C# Xamarin 文件上传到 API 可以使用 RestSharp,但不能使用 HttpClient