protected void InitializeHttpClient(HttpClientHandler httpClientHandler, params DelegatingHandler[] handlers) { HttpClientHandler = httpClientHandler; DelegatingHandler currentHandler = new RetryDelegatingHandler(); currentHandler.InnerHandler = HttpClientHandler; if (handlers != null) { for (int i = handlers.Length - 1; i >= 0; --i) { DelegatingHandler handler = handlers[i]; // Non-delegating handlers are ignored since we always // have RetryDelegatingHandler as the outer-most handler while (handler.InnerHandler is DelegatingHandler) { handler = handler.InnerHandler as DelegatingHandler; } handler.InnerHandler = currentHandler; currentHandler = handlers[i]; } } var newClient = new HttpClient(currentHandler, false); FirstMessageHandler = currentHandler; HttpClient = newClient; Type type = this.GetType(); HttpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(type.FullName, GetClientVersion())); }
/// <summary> /// Creates <see cref="DelegatingHandler"/> pipeline chain that will be used for further communication. The handlers are invoked in a top-down fashion. That is, the first entry is invoked first for /// an outbound request message but last for an inbound response message. /// </summary> /// <param name="httpClientHandler">HttpClientHandler</param> /// <param name="handlers">List of handlers from top to bottom (outer handler is the first in the list)</param> /// <returns></returns> protected virtual DelegatingHandler CreateHttpHandlerPipeline(HttpClientHandler httpClientHandler, params DelegatingHandler[] handlers) { // Now, the RetryAfterDelegatingHandler should be the absoulte outermost handler // because it's extremely lightweight and non-interfering DelegatingHandler currentHandler = new RetryDelegatingHandler(new RetryAfterDelegatingHandler { InnerHandler = httpClientHandler }); if (handlers != null) { for (int i = handlers.Length - 1; i >= 0; --i) { DelegatingHandler handler = handlers[i]; // Non-delegating handlers are ignored since we always // have RetryDelegatingHandler as the outer-most handler while (handler.InnerHandler is DelegatingHandler) { handler = handler.InnerHandler as DelegatingHandler; } handler.InnerHandler = currentHandler; currentHandler = handlers[i]; } } return(currentHandler); }
/// <summary> /// Sets retry policy for the client. /// </summary> /// <param name="retryPolicy">Retry policy to set.</param> public virtual void SetRetryPolicy(RetryPolicy retryPolicy) { if (retryPolicy == null) { retryPolicy = new RetryPolicy <TransientErrorIgnoreStrategy>(0); } RetryDelegatingHandler delegatingHandler = HttpMessageHandlers.OfType <RetryDelegatingHandler>().FirstOrDefault(); if (delegatingHandler != null) { delegatingHandler.RetryPolicy = retryPolicy; } else { throw new InvalidOperationException(ClientRuntime.Properties.Resources.ExceptionRetryHandlerMissing); } }
/// <summary> /// Sets retry policy for the client. /// </summary> /// <param name="retryPolicy">Retry policy to set.</param> public virtual void SetRetryPolicy(RetryPolicy retryPolicy) { if (retryPolicy == null) { throw new ArgumentNullException("retryPolicy"); } RetryDelegatingHandler delegatingHandler = HttpMessageHandlers.OfType <RetryDelegatingHandler>().FirstOrDefault(); if (delegatingHandler != null) { delegatingHandler.RetryPolicy = retryPolicy; } else { throw new InvalidOperationException(Properties.Resources.ExceptionRetryHandlerMissing); } }