public async Task DownloadAsync() { EventHandler <ProgressUpdatedEventArgs> eventHandler = (sender, e) => { this.DownloadMessage = e.Message; this.DownloadProgress = e.Progress; }; try { this.ClientState = ClientState.PrepareDownload; _dataService.Progress.ProgressChanged += eventHandler; var selectedDatasets = this.GetSelectedDatasets().Select(dataset => dataset.Model).ToList(); // security check var projectIds = selectedDatasets.Select(dataset => dataset.Parent.Parent.Id).Distinct(); foreach (var projectId in projectIds) { if (!Utilities.IsProjectAccessible(_userIdService.User, projectId, _databaseManager.Database)) { throw new UnauthorizedAccessException($"The current user is not authorized to access project '{projectId}'."); } } // var job = new ExportJob() { Owner = _userIdService.User.Identity.Name, Parameters = this.ExportParameters }; var exportJobService = _serviceProvider.GetRequiredService <JobService <ExportJob> >(); _exportJobControl = exportJobService.AddJob(job, _dataService.Progress, (jobControl, cts) => { var task = _dataService.ExportDataAsync(this.ExportParameters, selectedDatasets, cts.Token); return(task); }); var downloadLink = await _exportJobControl.Task; if (!string.IsNullOrWhiteSpace(downloadLink)) { var fileName = downloadLink.Split("/").Last(); await _jsRuntime.FileSaveAs(fileName, downloadLink); } } finally { _dataService.Progress.ProgressChanged -= eventHandler; this.ClientState = ClientState.Normal; this.DownloadMessage = string.Empty; this.DownloadProgress = 0; } }