Слишком большой объект запроса (413). (Исключение из HRESULT: 0x8019019D) при фоновой загрузке файла

Я создаю приложение, в котором мне нужно загрузить несколько файлов с Google Drive, количество файлов варьируется от 1 до 1000+ в зависимости от пользователей. Я думал использовать API фоновой загрузки из WinRT и Google Drive REST API. Я реализовал, как указано ниже. Теперь проблема в том, что я получаю Request entity too large (413). (Exception from HRESULT: 0x8019019D) в случайное время. После этого каждая задача загрузки файла либо выдает эту ошибку, либо "Bad Request (400)". Что может быть причиной этого? Мое требование - загружать файлы, даже если приложение переходит в приостановленное состояние.

Я также отслеживал запрос на загрузку в fiddler, там нет указаний на причину исключения.

Детали исключения:

Request entity too large (413). (Exception from HRESULT: 0x8019019D)

   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at XXXXX.YYYY.ZZZZZZ.<QueueDownloadFilesAsync>d__13f.MoveNext() in e:\Projects\xxx\yyy\aaa\qwerty.cs:line 1350
private static List<Task> DownloadCompletionTasks = new List<Task>();

public static async Task DownloadAllFilesAsync(string AccessToken)
{
    foreach (var _file in _NewFiles)
    {
        var TargetFolder = await GetTargetFolderForNewFolderCreationAsync(_file.DepthLevel, _file.Path);
        if (TargetFolder != null)
        {
            DownloadCompletionTasks.Add(QueueDownloadFilesAsync(AccessToken, _file.DownloadUrl, TargetFolder, _file.FileName, CreationCollisionOption.ReplaceExisting));
        }
    }
}

await Task.WhenAll(DownloadCompletionTasks);

public static async Task QueueDownloadFilesAsync(string AccessToken, string fileUrl, StorageFolder folder, string fileName, CreationCollisionOption CollisionOption)
{
    try
    {
        if ((fileName.ToValidFileName() + folder.Path).Length < 256)
        {
            var file = await folder.CreateFileAsync(fileName.ToValidFileName(), CollisionOption);
            backgroundDownloader.SetRequestHeader("Authorization", "bearer" + " " + AccessToken);
            var DownloadOperation = backgroundDownloader.CreateDownload(new Uri(fileUrl), file);

            var progress = new Progress<DownloadOperation>(ProgressCallback);
            await DownloadOperation.StartAsync().AsTask(progress);    //---Exception occures here---
            ResponseInformation response = DownloadOperation.GetResponseInformation();
            if (response.StatusCode == 200)
            {
                Debug.WriteLine("Download successfull.");
            }
            else
            {
                Debug.WriteLine("Error occurred while downloading file. HTTP error code: " + response.StatusCode);
            }
        }
    }

    catch (Exception ex)
    {
        if (ex.ToString().Contains("entity too large"))
        {
            Debug.WriteLine("File name: " + fileName + "\nPath: " + folder.Path + "\n\n" + ex.ToString());
        }
        else
        {
            Debug.WriteLine(ex.ToString());
        }
    }
}

1 ответ

Ваш сервер может быть настроен на отправку только определенных байтов данных для предотвращения атак DOS. Обычно это происходит со службами IIS, WCF и т. Д.

Еще одна настройка, о которой постоянно говорят с проблемами загрузки uploadReadAheadSize, Поскольку вы пытаетесь загрузить файл, а не загружать его, мы можем пропустить это.

Если это только на уровне IIS для вас:

<system.webServer> 
 <security> 
    <requestFiltering> 
       <requestLimits maxAllowedContentLength="5242880" /> 
    </requestFiltering> 
 </security> 
</system.webServer>

Если это WCF,

Настройки как maxReceivedMessageSize и т. д. модифицированы, чтобы приспособить для увеличенного размера.

нижеприведенная настройка устанавливает максимальный размер до 500 МБ.

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="5242880">
      </binding>
    </basicHttpBinding>
  </bindings>  
</system.serviceModel>

Раньше 413 ошибок составляли 400 ошибок, пока все не изменилось в IIS или WCF.

Другие вопросы по тегам