/// <summary> /// Отправка запроса на канал. Если канал "упал", выбирается следующий доступный /// </summary> /// <param name="currentChannel">Канал, по которому надо отправить запрос</param> /// <param name="request">Экземпляр заполненного запроса</param> /// <param name="tpe">Запрашиваемый заголовок запроса (нужен, если канал упал)</param> /// <returns>Экземпляр HttpResponseMessage</returns> private HttpResponseMessage GetResult(WebApiSyncChannel currentChannel, WebApiSyncRequest request, ContentTypes tpe = ContentTypes.xml) { try { // Добавляем в список запрос и обновляем значение коэффициента нагрузки currentChannel.RequestsList.Add(request); Task <HttpResponseMessage> response = currentChannel.Client.SendAsync(request); HttpResponseMessage result = response.Result; result.EnsureSuccessStatusCode(); currentChannel.ReqSended++; return(result); } catch (Exception ee) { // Канал не доступен, выбираем другой менее нагруженный, но не этот WebApiSyncChannel nextCannel = GetLessLoadedEndPoint(request.UsedChannels); request.UsedChannels.Add(nextCannel); WebApiSyncRequest newRequest = new WebApiSyncRequest(nextCannel, request.RequestUri.AbsolutePath, request.UsedChannels, request.Content == null ? null : request.Content.ReadAsAsync <XElement>().Result, tpe); return(GetResult(nextCannel, newRequest)); } finally { // Пришёл ответ или была ошибка, удаляем запрос из списка и обновляем значение коэффициента нагрузки currentChannel.RequestsList.Remove(request); } }
/// <summary> /// Генерация экземпляра запроса на основе параметров /// </summary> /// <param name="channel">Канал, используемый для отправки запроса</param> /// <param name="uri">Целевой путь для отправки запроса</param> /// <param name="UsedChannels">Список использованных каналов для отправки данного запроса</param> /// <param name="PostBody">Тело Post-запроса (если есть)</param> /// <param name="tpe">Запрашиваемый заголовок запроса</param> public WebApiSyncRequest(WebApiSyncChannel channel, string uri, List <WebApiSyncChannel> UsedChannels, XElement PostBody = null, ContentTypes tpe = ContentTypes.xml) : base() { if (uri[0] != '/') { uri = '/' + uri; } this.RequestUri = new Uri(channel.Uri.OriginalString + uri); this.UsedChannels = UsedChannels; switch (tpe) { case ContentTypes.xml: this.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml")); break; case ContentTypes.json: this.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); break; default: break; } if (PostBody == null) { this.Method = HttpMethod.Get; } else { this.Method = HttpMethod.Post; this.Content = new ObjectContent <XElement>(PostBody, new XmlMediaTypeFormatter()); } }
/// <summary> /// "Helper" - получение типизированного результата. /// </summary> /// <typeparam name="TResult">Тип</typeparam> /// <param name="tpe">Запрашиваемый заголовок запроса</param> /// <param name="uri">uri запроса</param> /// <returns>Возвращаемое значение</returns> public TResult GetResponse <TResult>(string uri, XElement PostBody = null, ContentTypes tpe = ContentTypes.xml) { WebApiSyncChannel channel = this.ZoneChannelsList[0];//GetLessLoadedEndPoint(); List <WebApiSyncChannel> UsedChannels = new List <WebApiSyncChannel>() { channel }; WebApiSyncRequest request = new WebApiSyncRequest(channel, uri, UsedChannels, PostBody, tpe); HttpResponseMessage response = GetResult(channel, request, tpe); return(response.Content.ReadAsAsync <TResult>().Result); }
public byte[] GetResponseBinary(string uri, XElement PostBody = null) { WebApiSyncChannel channel = GetLessLoadedEndPoint(); List <WebApiSyncChannel> UsedChannels = new List <WebApiSyncChannel>() { channel }; WebApiSyncRequest request = new WebApiSyncRequest(channel, uri, UsedChannels, PostBody, ContentTypes.binary); HttpResponseMessage response = GetResult(channel, request, ContentTypes.binary); return(response.Content.ReadAsByteArrayAsync().Result); }