コード例 #1
0
 /// <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);
     }
 }
コード例 #2
0
            /// <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());
                }
            }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        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);
        }