public async Task <IActionResult> DownloadDoc(string id) { using (_dbContext) { try { var tblProduct = await _dbContext.TblProduct .Include(tblP => tblP.TblDocument) .ThenInclude(tblD => tblD.TblDocumentData) .FirstOrDefaultAsync(tblP => (tblP.IdProduct).ToString() == id); var contentType = _files.GetContentType(tblProduct.Url); var fileName = _files.GetFileName(tblProduct.Url); MemoryStream content; var tblDocument = tblProduct.TblDocument.FirstOrDefault(); //await _dbContext.TblDocument.FirstOrDefaultAsync(d => d.ProductId == tblProduct.IdProduct); if (tblDocument == null) { //no downloaded file content = await _download.GetContent(tblProduct.Url); TblDocumentData tblData = new TblDocumentData { IdDocument = Guid.NewGuid(), BinaryData = content.ToArray() }; tblDocument = new TblDocument { IdDoc = tblData.IdDocument, ProductId = tblProduct.IdProduct, Type = contentType, Downloaded = DateTime.Now, Product = tblProduct, TblDocumentData = tblData }; await _dbContext.TblDocument.AddAsync(tblDocument); await _dbContext.TblDocumentData.AddAsync(tblData); await _dbContext.SaveChangesAsync(); } else {//previous downloaded file var tblData = tblDocument.TblDocumentData; //var tblData = await _dbContext.TblDocumentData // .FirstOrDefaultAsync(d => d.IdDocument == tblDocument.IdDoc); if ((tblDocument.Downloaded.HasValue) && (tblDocument.Downloaded.Value <= DateTime.Now.AddDays(-3))) {//older than 3 days content = await _download.GetContent(tblProduct.Url); tblDocument.Downloaded = DateTime.Now; tblDocument.Type = contentType; if (content.ToArray() != tblData.BinaryData) {//binary content changed tblData.BinaryData = content.ToArray(); } await _dbContext.SaveChangesAsync(); } else { content = new MemoryStream(tblData.BinaryData); } } return(File(content, contentType, fileName)); } catch (Exception e) { return(BadRequest(e.Message)); } } }