示例#1
0
        private FileUploadParameters CreateFileUploadParameters(EntityUploadParameters parameters)
        {
            CreateWorkingDirectoryIfNeeded();

            var fileName = Path.Combine(WorkingDirectory, Guid.NewGuid() + ".csv");

            using (var writer = new BulkFileWriter(fileName))
            {
                foreach (var entity in parameters.Entities)
                {
                    writer.WriteEntity(entity);
                }
            }

            var fileUploadParameters = new FileUploadParameters
            {
                UploadFilePath      = fileName,
                ResponseMode        = parameters.ResponseMode,
                ResultFileDirectory = parameters.ResultFileDirectory,
                ResultFileName      = parameters.ResultFileName,
                OverwriteResultFile = parameters.OverwriteResultFile,
                RenameUploadFileToMatchRequestId = true
            };

            return(fileUploadParameters);
        }
示例#2
0
        /// <summary>
        /// Uploads the specified Bulk entities.
        /// </summary>
        /// <param name="parameters">Determines various upload parameters, for example what entities to upload. Please see <see cref="EntityUploadParameters"/> for more information about available parameters.</param>
        /// <param name="progress">A class implementing <see cref="IProgress{T}"/> for tracking the percent complete progress information for the bulk operation.</param>
        /// <param name="cancellationToken">Cancellation token that can be used to cancel the tracking of the bulk operation on the client. Doesn't cancel the actual bulk operation on the server.</param>
        /// <returns>A task that represents the asynchronous operation. The task result will be an enumerable list of <see cref="BulkEntity"/> objects.</returns>
        /// <exception cref="FaultException{TDetail}">Thrown if a fault is returned from the Bing Ads service.</exception>
        /// <exception cref="OAuthTokenRequestException">Thrown if tokens can't be refreshed due to an error received from the Microsoft Account authorization server.</exception>
        /// <exception cref="BulkOperationCouldNotBeCompletedException{TStatus}">Thrown if the bulk operation has failed.</exception>
        public Task <IEnumerable <BulkEntity> > UploadEntitiesAsync(EntityUploadParameters parameters, IProgress <BulkOperationProgressInfo> progress, CancellationToken cancellationToken)
        {
            ValidateEntityUploadParameters(parameters);

            ValidateUserData();

            var fileUploadParameters = CreateFileUploadParameters(parameters);

            return(UploadEntitiesAsyncImpl(progress, cancellationToken, fileUploadParameters));
        }
示例#3
0
        private bool NeedToTryUploadEntityRecordsSyncFirst(EntityUploadParameters parameters)
        {
            int count = 0;

            foreach (var entity in parameters.Entities)
            {
                count++;
            }
            return(count <= SyncThreshold);
        }
示例#4
0
        private static void ValidateEntityUploadParameters(EntityUploadParameters parameters)
        {
            if (parameters == null)
            {
                throw new NullReferenceException("parameters");
            }

            if (parameters.Entities == null)
            {
                throw new ArgumentException(ErrorMessages.EntitiesMustNotBeNull);
            }
        }
示例#5
0
        private async Task <IEnumerable <BulkEntity> > UploadEntityRecordsImpl(EntityUploadParameters parameters, IProgress <BulkOperationProgressInfo> progress, CancellationToken cancellationToken)
        {
            var request = new UploadEntityRecordsRequest()
            {
                EntityRecords = WriteUploadEntitiesAsPayload(parameters.Entities),
                ResponseMode  = ResponseMode.ErrorsAndResults
            };

            try
            {
                using (var bulkService = new ServiceClient <IBulkService>(_authorizationData, _apiEnvironment))
                {
                    var uploadEntityRecordsResponse = await bulkService.CallAsync((s, r) => s.UploadEntityRecordsAsync(r), request).ConfigureAwait(false);

                    if (FallBacktoAsync(uploadEntityRecordsResponse))
                    {
                        using (var operation = new BulkUploadOperation(uploadEntityRecordsResponse.RequestId, _authorizationData, uploadEntityRecordsResponse.TrackingId, _apiEnvironment)
                        {
                            StatusPollIntervalInMilliseconds = StatusPollIntervalInMilliseconds,
                            DownloadHttpTimeout = DownloadHttpTimeout
                        })
                        {
                            await operation.TrackAsync(progress, cancellationToken).ConfigureAwait(false);

                            var resultFile = await DownloadBulkFile(parameters.ResultFileDirectory,
                                                                    parameters.ResultFileName,
                                                                    parameters.OverwriteResultFile,
                                                                    operation).ConfigureAwait(false);


                            return(new BulkEntityReaderEnumerable(BulkEntityReaderFactory.CreateBulkFileReader(resultFile, ResultFileType.Upload, DownloadFileType.Csv)));
                        }
                    }
                    return(new BulkEntityReaderEnumerable(BulkEntityReaderFactory.CreateBulkRowsReader(uploadEntityRecordsResponse.EntityRecords)));
                }
            }
            catch (FaultException ex)
            {
                if (NeedToRetryWithBulkUpload(ex))
                {
                    var fileUploadParameters = CreateFileUploadParameters(parameters);

                    return(await UploadEntitiesAsyncImpl(progress, cancellationToken, fileUploadParameters));
                }
                throw;
            }
        }
示例#6
0
        /// <summary>
        /// Uploads the specified Bulk entities.
        /// </summary>
        /// <param name="parameters">Determines various upload parameters, for example what entities to upload. Please see <see cref="EntityUploadParameters"/> for more information about available parameters.</param>
        /// <param name="progress">A class implementing <see cref="IProgress{T}"/> for tracking the percent complete progress information for the bulk operation.</param>
        /// <param name="cancellationToken">Cancellation token that can be used to cancel the tracking of the bulk operation on the client. Doesn't cancel the actual bulk operation on the server.</param>
        /// <returns>A task that represents the asynchronous operation. The task result will be an enumerable list of <see cref="BulkEntity"/> objects.</returns>
        /// <exception cref="FaultException{TDetail}">Thrown if a fault is returned from the Bing Ads service.</exception>
        /// <exception cref="OAuthTokenRequestException">Thrown if tokens can't be refreshed due to an error received from the Microsoft Account authorization server.</exception>
        /// <exception cref="BulkOperationCouldNotBeCompletedException{TStatus}">Thrown if the bulk operation has failed.</exception>
        public Task <IEnumerable <BulkEntity> > UploadEntitiesAsync(EntityUploadParameters parameters, IProgress <BulkOperationProgressInfo> progress, CancellationToken cancellationToken)
        {
            ValidateEntityUploadParameters(parameters);

            ValidateUserData();

            if (NeedToTryUploadEntityRecordsSyncFirst(parameters))
            {
                return(UploadEntityRecordsImpl(parameters, progress, cancellationToken));
            }
            else
            {
                var fileUploadParameters = CreateFileUploadParameters(parameters);

                return(UploadEntitiesAsyncImpl(progress, cancellationToken, fileUploadParameters));
            }
        }
示例#7
0
 /// <summary>
 /// Uploads the specified Bulk entities.
 /// </summary>
 /// <param name="parameters">Determines various upload parameters, for example what entities to upload. Please see <see cref="EntityUploadParameters"/> for more information about available parameters.</param>
 /// <returns>A task that represents the asynchronous operation. The task result will be an enumerable list of <see cref="BulkEntity"/> objects.</returns>
 /// <exception cref="FaultException{TDetail}">Thrown if a fault is returned from the Bing Ads service.</exception>
 /// <exception cref="OAuthTokenRequestException">Thrown if tokens can't be refreshed due to an error received from the Microsoft Account authorization server.</exception>
 /// <exception cref="BulkOperationCouldNotBeCompletedException{TStatus}">Thrown if the bulk operation has failed.</exception>
 public Task <IEnumerable <BulkEntity> > UploadEntitiesAsync(EntityUploadParameters parameters)
 {
     return(UploadEntitiesAsync(parameters, null, CancellationToken.None));
 }