Слишком большой объект запроса (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.