/// <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> /// "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); }