Я пытаюсь загрузить большой 3,5 ГБ SDB-файл в SVF-файл из BIM360 с помощью Derivative API. Будучи большим файлом, я пытаюсь загрузить его кусками, как описано здесь эта ссылка
Ниже приведена моя реализация с использованием RestSharp :
static async Task DownloadAsync(string AccessToken, string RemotePath, string folderPath, Tuple<long, long, string> chunck, int retry)
{
string pathToSave = Path.Combine(folderPath, chunck.Item3 + ".part");
IRestClient client = new RestClient("https://developer.api.autodesk.com/");
RestRequest vRequest = new RestRequest(RemotePath, Method.GET);
vRequest.AddHeader("Authorization", "Bearer " + AccessToken);
vRequest.AddHeader("Accept-Encoding", "gzip, deflate");
vRequest.AddHeader("Range", "bytes=" + chunck.Item1 + "-" + chunck.Item2);
IRestResponse response = await client.ExecuteTaskAsync(vRequest);
if (response.StatusCode != System.Net.HttpStatusCode.PartialContent)
{
Tools.LogWriter("Error");
}
else
{
File.WriteAllBytes(pathToSave, response.RawBytes);
}
}
То же, используя WebClient :
static async Task DownloadAsync(string AccessToken, string RemotePath, string folderPath, Tuple<long, long, string> chunck, int retry)
{
string pathToSave = Path.Combine(folderPath, chunck.Item3 + ".part");
var request = (HttpWebRequest)WebRequest.Create("https://developer.api.autodesk.com/" + RemotePath);
request.Headers.Add("Authorization", "Bearer " + AccessToken);
request.AddRange(chunck.Item1, chunck.Item2);
using (var response = await request.GetResponseAsync())
using (var stream = response.GetResponseStream())
using (var output = File.Create(pathToSave))
{
await stream.CopyToAsync(output);
}
}
Использование HttpClient с повторной попыткой:
static async Task DownloadAsync(string AccessToken, string RemotePath, string folderPath, Tuple<long, long, string> chunck, int retry)
{
try
{
string pathToSave = Path.Combine(folderPath, chunck.Item3 + ".part");
var client = new HttpClient();
client.DefaultRequestHeaders.Range = new RangeHeaderValue(chunck.Item1, chunck.Item2);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
using (var stream = await client.GetStreamAsync("https://developer.api.autodesk.com/" + RemotePath))
using (var output = File.Create(pathToSave))
{
await stream.CopyToAsync(output);
}
}
catch (Exception e)
{
if (retry !=0)
{
await DownloadAsync(AccessToken, RemotePath, folderPath, chunck, retry -1);
}
else
{
Console.WriteLine("Error Async Download");
}
}
}
Загруженные файлы чанков имеют размер 50 Мб и более объединены в один файл SDB. Процедура работает для небольших файлов SDB - от 300 до 2000 МБ - но для этого конкретного файла RestClient перестает получать после загрузки 95% деталей.
Несколько замечаний:
- Failing куски не всегда одинаковы
- Сбой процедуры до истечения срока действия маркера доступа.
- Программа выполняется случайным образом 10% раз.
Есть идеи?