Exemplo n.º 1
0
        public void SubmitBatchAndWait(IBatchRequest batch, bool urgent)
        {
            int completed = 0;
            Dictionary <IRequest, BaseRequest.RequestCompletedCallback> callbacks = new Dictionary <IRequest, BaseRequest.RequestCompletedCallback>();
            ManualResetEvent mre = new ManualResetEvent(false);

            foreach (IRequest req in batch.Requests)
            {
                BaseRequest.RequestCompletedCallback _callback = req.RequestCompleteCallback;
                callbacks.Add(req, _callback);

                req.RequestCompleteCallback = delegate(IRequest r)
                {
                    completed++;
                    callbacks[r](r);
                    if (completed >= batch.Requests.Count)
                    {
                        mre.Set();
                    }
                };

                SubmitRequest(req, false);
            }
            mre.WaitOne();
        }
Exemplo n.º 2
0
        private void DoBatchRequest()
        {
            IBatchRequest req = _client.RequestManager.GetNextBatchRequest();

            if (req == null)
            {
                return;
            }
            foreach (IRequest r in req.Requests)
            {
                DoRequest(r);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Inserts a new batch request to the end of the pending requests list
        /// </summary>
        /// <param name="batch"></param>
        /// <param name="urgent"></param>
        public void SubmitBatchRequest(IBatchRequest batch, bool urgent)
        {
            InjectClient(batch.Requests.ToArray());

            lock (_pendingBatchRequests)
            {
                if (urgent)
                {
                    _pendingBatchRequests.Insert(0, batch);
                }
                else
                {
                    _pendingBatchRequests.Add(batch);
                }
            }
        }
Exemplo n.º 4
0
        public async Task <IReadOnlyList <Response> > BatchAsync(IBatchRequest request, CancellationToken cancellationToken = default, bool?notfoundIsSuccess = null)
        {
            var message = request.CreateMessage();

            _credentialBuilder?.Build(_httpClient, message);

            var response = await _httpClient.SendAsync(message, cancellationToken);

            if (!response.Content.IsMimeMultipartContent())
            {
                return new[] { await ParseAsync(response.StatusCode, response.Content, response.Headers, notfoundIsSuccess ?? NotFoundIsSuccess) }
            }
            ;

            var multipart = await response.Content.ReadAsMultipartAsync(cancellationToken);

            return(await ParseMultiAsync(multipart, response.Headers, cancellationToken, notfoundIsSuccess));
        }
Exemplo n.º 5
0
        public async Task <IEnumerable <Response> > BatchAsync(IBatchRequest request)
        {
            var message = request.CreateMessage();

            _credentialBuilder?.Build(_httpClient, message);

            var response = await _httpClient.SendAsync(message);

            if (!response.Content.IsMimeMultipartContent())
            {
                return new[] { await ParseAsync(response.StatusCode, response.Content, response.Headers) }
            }
            ;

            var multipart = await response.Content.ReadAsMultipartAsync();

            return(await ParseMultiAsync(multipart, response.Headers));
        }
Exemplo n.º 6
0
        public async Task <IEnumerable <Response> > BatchAsync(IBatchRequest request)
        {
            var message = request.CreateMessage();

            message.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            _credentialBuilder?.Build(_httpClient, message);

            var response = await _httpClient.SendAsync(message);

            if (!response.Content.IsMimeMultipartContent())
            {
                return new[] { await ParseAsync(response.StatusCode, response.Content) }
            }
            ;

            var multipart = await response.Content.ReadAsMultipartAsync();

            return(await ParseMultiAsync(multipart));
        }
Exemplo n.º 7
0
        /// <summary>
        /// Submits a batch of asynchronous requests
        /// </summary>
        /// <param name="batch"></param>
        /// <param name="urgent"></param>
        public void SubmitAsyncBatchRequest(IBatchRequest batch, bool urgent)
        {
            lock (_pendingRequests)
            {
                foreach (IRequest req in batch.Requests)
                {
                    InjectClient(req);

                    if (urgent)
                    {
                        _pendingRequests.Insert(0, req);
                    }
                    else
                    {
                        _pendingRequests.Add(req);
                    }
                }
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// Gets the next pending batch request.
        /// </summary>
        /// <returns></returns>
        public IBatchRequest GetNextBatchRequest()
        {
            IBatchRequest req = null;

            lock (_pendingBatchRequests)
            {
                if (_pendingBatchRequests.Count == 0)
                {
                    return(req);
                }
                req = _pendingBatchRequests[0];
                _pendingBatchRequests.RemoveAt(0);
                lock (_activeRequests)
                {
                    foreach (IRequest r in req.Requests)
                    {
                        _activeRequests.Add(r);
                    }
                }
            }

            return(req);
        }
Exemplo n.º 9
0
 private void FolderDataCallback(IBatchRequest req)
 {
     foldersPopulated = true;
     ColorConsole.WriteLine("^11:00Done\n");
 }
Exemplo n.º 10
0
 public Task <IReadOnlyList <Response> > SendAsync(IBatchRequest batchRequest, CancellationToken cancellationToken = default, bool?notfoundIsSuccess = null)
 {
     return(BatchAsync(batchRequest, cancellationToken, notfoundIsSuccess));
 }
Exemplo n.º 11
0
        public void SubmitBatchAndWait(IBatchRequest batch, bool urgent)
        {
            int completed = 0;
            Dictionary<IRequest, BaseRequest.RequestCompletedCallback> callbacks = new Dictionary<IRequest, BaseRequest.RequestCompletedCallback>();
            ManualResetEvent mre = new ManualResetEvent(false);
            foreach (IRequest req in batch.Requests)
            {
                BaseRequest.RequestCompletedCallback _callback = req.RequestCompleteCallback;
                callbacks.Add(req, _callback);

                req.RequestCompleteCallback = delegate(IRequest r)
                                                  {
                                                      completed++;
                                                      callbacks[r](r);
                                                      if (completed >= batch.Requests.Count)
                                                          mre.Set();
                                                  };

                SubmitRequest(req, false);
            }
            mre.WaitOne();
        }
Exemplo n.º 12
0
 /// <summary>
 /// Submits a batch of asynchronous requests
 /// </summary>
 /// <param name="batch"></param>
 /// <param name="urgent"></param>
 public void SubmitAsyncBatchRequest(IBatchRequest batch, bool urgent)
 {
     lock(_pendingRequests)
     {
         foreach (IRequest req in batch.Requests)
         {
             InjectClient(req);
             
             if (urgent)
                 _pendingRequests.Insert(0, req);
             else
                 _pendingRequests.Add(req);
                 
             
         }
     }
 }
Exemplo n.º 13
0
 /// <summary>
 /// Inserts a new batch request to the end of the pending requests list
 /// </summary>
 /// <param name="batch"></param>
 /// <param name="urgent"></param>
 public void SubmitBatchRequest(IBatchRequest batch, bool urgent)
 {
     InjectClient(batch.Requests.ToArray());
     
     lock (_pendingBatchRequests)
     {
         if (urgent)
             _pendingBatchRequests.Insert(0, batch);
         else
             _pendingBatchRequests.Add(batch);
     }
 }
Exemplo n.º 14
0
        public async Task <BatchResult> BatchAsync(IBatchRequest request)
        {
            if (request == null || request.BatchRequests.Count <= 0)
            {
                throw new ArgumentNullException(nameof(request));
            }

            try
            {
                var resourceName = $"{request.Prefix}composite/batch";

                if (request.HaltOnError)
                {
                    if (request.BatchRequests.Count > Dnf.BatchLimit)
                    {
                        throw new ArgumentOutOfRangeException(nameof(request));
                    }

                    var inputObject = new JObject
                    {
                        ["batchRequests"] = JToken.FromObject(request.BatchRequests.Select(req => Dnf.Assign(JObject.FromObject(req), new JObject
                        {
                            ["url"] = DecodeReference($"/services/data/{ApiVersion}/{request.Prefix}{req.Url?.TrimStart('/')}")
                        }))),
                        ["haltOnError"] = true
                    };

                    var result = await JsonHttp.HttpPostAsync <BatchResultBody>(inputObject, resourceName)
                                 .ConfigureAwait(false);

                    var results = new BatchResult(request.BatchRequests, result?.Results ?? new List <BatchSubRequestResult>());
                    return(results);
                }
                else
                {
                    var throttler = new SemaphoreSlim(Dnf.DefaultConcurrentLimit, Dnf.DefaultConcurrentLimit);
                    var results   = new BatchResult();

                    var chunks = new List <IList <BatchSubRequest> >();
                    IList <BatchSubRequest>?chunk = null;

                    foreach (var req in request.BatchRequests)
                    {
                        var added = false;

                        if (chunk?.Count < Dnf.BatchLimit)
                        {
                            chunk.Add(req);
                            added = true;
                        }

                        if (added)
                        {
                            continue;
                        }
                        chunk = new List <BatchSubRequest> {
                            req
                        };
                        chunks.Add(chunk);
                    }

                    var tasks = new List <Task>();

                    foreach (var requests in chunks)
                    {
                        await throttler.WaitAsync()
                        .ConfigureAwait(false);

                        tasks.Add(Task.Run(async() =>
                        {
                            try
                            {
                                var inputObject = new JObject
                                {
                                    ["batchRequests"] = JToken.FromObject(requests.Select(req => Dnf.Assign(JObject.FromObject(req), new JObject
                                    {
                                        ["url"] = DecodeReference($"/services/data/{ApiVersion}/{request.Prefix}{req.Url?.TrimStart('/')}")
                                    })))
                                };


                                var result = await JsonHttp.HttpPostAsync <BatchResultBody>(inputObject, resourceName)
                                             .ConfigureAwait(false);
                                results.Add(requests, result?.Results ?? new List <BatchSubRequestResult>());
                            }
                            catch (Exception ex)
                            {
                                var body = new JArray {
                                    ex.Message
                                };
                                var responses = requests.Select(req => new BatchSubRequestResult
                                {
                                    Result     = body,
                                    StatusCode = 500
                                }).ToList();
                                results.Add(requests, responses);
                            }
                            finally
                            {
                                throttler.Release();
                            }
                        }));
                    }
                    await Task.WhenAll(tasks)
                    .ConfigureAwait(false);

                    return(results);
                }
            }
            catch (Exception ex)
            {
                var body = new JArray {
                    ex.Message
                };
                var responses = request.BatchRequests.Select(req => new BatchSubRequestResult
                {
                    Result     = body,
                    StatusCode = 500
                }).ToList();
                var results = new BatchResult(request.BatchRequests, responses);
                return(results);
            }
        }
Exemplo n.º 15
0
 private void FolderDataCompleted(IBatchRequest req)
 {
     //UpdateProgressWindow(0, false);
     UpdateFolderListState(true);
     UpdateLabel("Folder data loaded.");
 }
Exemplo n.º 16
0
 public async Task <IEnumerable <Response> > SendAsync(IBatchRequest batchRequest)
 {
     return(await BatchAsync(batchRequest));
 }
Exemplo n.º 17
0
 private void FolderDataCompleted(IBatchRequest req)
 {
     //UpdateProgressWindow(0, false);
     UpdateFolderListState(true);
     UpdateLabel("Folder data loaded.");
 }