از سرگیری مجدد، لغو درخواست و سعی مجدد دریافت فایلهای حجیم توسط HttpClient
نویسنده: وحید نصیری
تاریخ: ۱۳۹۶/۱۰/۲۶ ۱۴:۴۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
var fileInfo = new FileInfo(outputFilePath);
long resumeOffset = 0;
if (fileInfo.Exists)
{
resumeOffset = fileInfo.Length;
}
if (resumeOffset > 0)
{
_client.DefaultRequestHeaders.Range = new RangeHeaderValue(resumeOffset, null);
} var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
if (response.Headers.AcceptRanges == null && resumeOffset > 0)
{
// resume not supported, starting over
} private readonly CancellationTokenSource _cts = new CancellationTokenSource();
var result = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, _cts.Token);
using(var stream = await result.Content.ReadAsStreamAsync())
{
byte[] buffer = new byte[80000];
int bytesRead;
while((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0 &&
!_cts.IsCancellationRequested)
{
outputStream.Write(buffer, 0, bytesRead);
}
} public async Task DownloadFileAsync(string url, string outputFilePath, int maxRequestAutoRetries)
{
var exceptions = new List<Exception>();
do
{
--maxRequestAutoRetries;
try
{
await doDownloadFileAsync(url, outputFilePath);
}
catch (TaskCanceledException ex)
{
exceptions.Add(ex);
}
catch (HttpRequestException ex)
{
exceptions.Add(ex);
}
catch (Exception ex) when (isNetworkError(ex))
{
exceptions.Add(ex);
}
// Wait a bit and try again later
if (exceptions.Any()) await Task.Delay(2000, _cts.Token);
} while (maxRequestAutoRetries > 0 &&
!_cts.IsCancellationRequested);
var uniqueExceptions = exceptions.Distinct().ToList();
if (uniqueExceptions.Any())
{
if (uniqueExceptions.Count() == 1)
throw uniqueExceptions.First();
throw new AggregateException("Could not process the request.", uniqueExceptions);
}
}
private static bool isNetworkError(Exception ex)
{
if (ex is SocketException || ex is WebException)
return true;
if (ex.InnerException != null)
return isNetworkError(ex.InnerException);
return false;
} public class HomeController : Controller
{
public IActionResult GetFile()
{
return PhysicalFile(@"C:\path\file.pdf", "application/pdf");
}
var result = new FileStreamResult(readStream, contentType)
{
LastModified = lastModified,
EntityTag = entityTag,
EnableRangeProcessing = true,
};
return PhysicalFile(path, "text/plain", "downloadName.txt", lastModified, entityTag, true);
return File(data, "text/plain", "downloadName.txt", lastModified: null, entityTag: entityTag,
enableRangeProcessing: true); public async Task<IActionResult> Get () {
var url = "https://anthonygiretti.blob.core.windows.net/videos/earth.mp4";
return new FileStreamResult (await this._httpClient.GetStreamAsync (url), "video/mp4") {
EnableRangeProcessing = true
};
}
public IActionResult FileStreamActionResult()
{
var fileStream = System.IO.File.OpenRead(@"D:\path\Controllers\HomeController.cs");
return new FileStreamResult(fileStream, "text/plain") { FileDownloadName = "HomeController.cs" };
}
downloadOrder(orderId: number , userId : string) {
this._http.get(this._config.getApiURI() + '/Download/productfile/' + orderId + '/' + userId, { observe: 'blob'})
.subscribe(
(data) => {
if(this._functionService.isNullOrEmpty(data.body)){
this._snackBarService.error('فایل پیدا نشد');
return;
}
var contentType = data.body.type || "application/octet-stream";
var fileInfo = JSON.parse(data.headers.get('FileInfo'));
var blob = new Blob([data.body], { type: contentType });
var url = window.URL.createObjectURL(blob);
var anchor = document.createElement("a");
anchor.setAttribute("href", url)
anchor.setAttribute("download", fileInfo.fileName + fileInfo.fileType);
anchor.setAttribute("target", "_blank");
document.body.appendChild(anchor);
anchor.click();
setTimeout(function () {
document.body.removeChild(anchor);
window.URL.revokeObjectURL(url);
}, 200);
},
error => {
this._snackBarService.error(error);
});
} while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
await Response.Body.WriteAsync(buffer);
//return File(buffer, GetContentType(fullPath), newFileName, true);
//return new FileStreamResult(stream,"application/octet-stream");
}