public virtual async Task <IHttpActionResult> Download(Guid sourceId)
        {
            var fileSource = context.GetDataSource <FileDataSource>(sourceId);

            if (fileSource == null)
            {
                return(NotFound());
            }
            var memoryStream = await streamManager.RetrieveData(sourceId, fileSource.CurrentFileName);

            var contentLength = memoryStream.Length;

            MediaTypeHeaderValue mediaType;

            MediaTypeHeaderValue.TryParse(fileSource.MediaType, out mediaType);
            var contentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = fileSource.OriginalFileName,
                Size     = contentLength
            };
            var result = new FileActionResult(
                Request,
                memoryStream,
                mediaType,
                memoryStream.Length,
                contentDisposition);

            return(result);
        }
        public virtual SourceResultDataContract ValidateSource(Guid sourceId)
        {
            var fileSource = Context.GetDataSource <FileDataSource>(sourceId);

            if ((fileSource == null) || (fileSource.InputStatus != SourceStatus.PendingExtraction))
            {
                return(DataContractError(sourceId, DataSourceServiceResources.FileSourceIsNotPendingExtraction));
            }
            Context.RemoveSourceErrors(sourceId);
            var returnResult = DataContractSuccess(sourceId);
            var handler      = handlerFactory.CreateHandler(fileSource.HandlerName);

            if (Context.FileIsDuplicate(fileSource))
            {
                var message = DataSourceServiceResources.DuplicateFile;
                ReportSourceError(sourceId, SourceErrorType.DuplicateFile, message);
                returnResult.Succeeded = false;
                returnResult.ErrorMessages.Add(message);
                return(returnResult);
            }
            if (handler == null)
            {
                var message = string.Format(DataSourceServiceResources.InvalidHandlerMessage, fileSource.HandlerName);
                ReportSourceError(sourceId, SourceErrorType.FileTypeNotFound, message);
                returnResult.Succeeded = false;
                returnResult.ErrorMessages.Add(message);
                return(returnResult);
            }
            try
            {
                using (var fileStream = streamManager.RetrieveData(sourceId, fileSource.CurrentFileName).Result)
                {
                    foreach (var missingColumn in handler.MissingColumns(fileSource.CurrentFileName, fileStream))
                    {
                        var message = DataSourceServiceResources.MissingRowsMessage;
                        var columns = string.Join(",", missingColumn.Value);
                        message = string.Format(message, missingColumn.Key, columns);
                        ReportSourceError(sourceId, SourceErrorType.MissingFields, message);
                        returnResult.Succeeded = false;
                        returnResult.ErrorMessages.Add(message);
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionPolicy.HandleException(ex, Policy.DataEntry);
                var message = DataSourceServiceResources.UnReadableFile;
                returnResult.Succeeded = false;
                returnResult.ErrorMessages.Add(message);
                ReportSourceError(sourceId, SourceErrorType.UnReadableFile, message);
            }
            return(returnResult);
        }