public UploadeModel DownloadFile(string fileId, IEnumerable <ByteDetectorModel> part) { UploadeModel result = null; _request = _serverConnect.RequestLoadingUnitInfo(fileId); _response = _serverConnect.SendRequest(_request).Result; RangeModel range = null; _request = _serverConnect.RequestDownLoading(fileId, range); _response = _serverConnect.SendRequest(_request).Result; return(result); }
public UploadeResultModel UploadFile(UploadeModel uploadeMod) { if (uploadeMod == null || !uploadeMod.Parts.Any()) { return(null); } UploadeResultModel result = null; var count = uploadeMod.Parts.Count(); var fileGuid = string.Empty; IList <ByteDetectorModel> fileParts = null; DateTime?fileDate = null; RequestErrorModel error = null; if (count > 1) { _request = _serverConnect.RequestLoadingUnitStartSession(uploadeMod.FileInfo.FileName, uploadeMod.FileInfo.FileSize, count); _response = _serverConnect.SendRequest(_request).Result; var content = _response.Content.ReadAsStringAsync().Result; var session = _response.ResultEnginer <ResponseIdModel>(); //Убираю лимит на количество одновременных запросов. ServicePointManager.DefaultConnectionLimit = 15; //возможно эту часть необходимо вынести в отдельный метод для потдержки докачки частей в случае сбоя //и нужно рассмотреть возможность рекурсивной работы этого метода Parallel.ForEach(uploadeMod.Parts, (part, state) => { //распаралелить _request = _serverConnect.RequestLoadingPart(part.Unit, part.Unit.Length, part.Md5Hash, part.PartDetect.Part, session.UploadId); _response = _serverConnect.SendRequest(_request).Result; var stateUploaded = _response.ResultEnginer <ResponseModel>(); if (stateUploaded.ServerError != null) { //Возникла ошибка при загрузке части } }); _request = _serverConnect.RequestLoadingUnitCloseSession(session.UploadId); _response = _serverConnect.SendRequest(_request).Result; var closeSess = _response.ResultEnginer <ResponseSessionCloseModel>(); if (closeSess.IsClose == false) { //Ошибка сессию по какой-то причине не удалось закрыть error = new RequestErrorModel(); } else { fileGuid = session.UploadId; fileParts = uploadeMod.Parts.Select(p => p.PartDetect).ToList(); fileDate = closeSess.ResultDate?.DateTime; } } else if (count == 1) { var part = uploadeMod.Parts.FirstOrDefault(); //это никогда не наступит но решарпер предупреждает... if (part == null) { return(null); } _request = _serverConnect.RequestLoadingPart(part.Unit, part.Unit.Length, part.Md5Hash, uploadeMod.FileInfo.FileName); _response = _serverConnect.SendRequest(_request).Result; var uploadeId = _response.ResultEnginer <ResponseIdModel>(false); // Проверка на ошибку... это уже надо делать при непосредственных запросах... Ибо мой компилятор в мозгу физически ограничен, ну или я его сам ограничиваю)))) fileGuid = uploadeId.UploadId; fileDate = uploadeId.ResultDate?.DateTime; } else { throw new Exception("Что-то пошло не так, количество частей меньше одной."); } result = error != null ? new UploadeResultModel { ErrorMessage = error } : new UploadeResultModel { FileName = uploadeMod.FileInfo.FileName, FileSize = uploadeMod.FileInfo.FileSize, GostHash = uploadeMod.GostHash, Repository = _repository, FileGuid = fileGuid, Parts = fileParts, UTime = fileDate }; return(result); }