コード例 #1
0
        /// <summary>
        /// отправка запроса с результатом в виде строки
        /// </summary>
        /// <param name="url">запрос</param>
        /// <param name="code">код ответа сервера</param>
        /// <param name="contentType">Заголовок Content Type</param>
        /// <param name="cookies">Строка данных Cookie формата название=значение;название=значение</param>
        /// <param name="customHeaders">дополнительные заголовки формата название:значение;название:значение</param>
        /// <param name="forceDisableCache">принудительное отключение кэшивания для этого запроса</param>
        /// <param name="referer">заголовок referer</param>
        /// <param name="useGZip">истина, если сервер использует сжатие</param>
        /// <param name="xrequested">Заголовок X-Requested-With</param>
        /// <returns></returns>
        /// <exception cref="WebException">Если произошла ошибка при подключении</exception>
        protected string SendStringGetRequest(string url, out HttpStatusCode code, bool useGZip = true, string referer = null, string contentType = "application/xml",
                                              string xrequested = null, string cookies = null, string customHeaders = null, bool forceDisableCache = false)
        {
            if (useCache && !forceDisableCache) //если используем кэш и кэш принудительно не отключен для этого запроса
            {
                if (cache.ContainsWebUrl(url))
                {
                    code = HttpStatusCode.OK;
                    return(cache.GetWebUrl(url));
                }
            }
            try
            {
                //ожидание времени интервала между запросами
                while (DateTime.Now - lastQuery < MinQueryInterval)
                {
                    Thread.Sleep(50);
                }

                //Выполняем запрос к универсальному коду ресурса (URI).

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                if (UseProxy)
                {
                    WebProxy wp = new WebProxy(ProxyHost, ProxyPort);
                    request.Proxy = wp;
                }
                request.UserAgent   = UserAgent;
                request.ContentType = contentType;
                request.Headers[HttpRequestHeader.AcceptLanguage] = "ru - RU,ru; q = 0.8,en - US; q = 0.6,en; q = 0.4";
                if (useGZip)
                {
                    request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip";
                }
                request.Accept = "application/json, text/javascript, */*; q=0.01";
                if (!string.IsNullOrWhiteSpace(xrequested))
                {
                    request.Headers.Add("X-Requested-With", xrequested);
                }
                if (!string.IsNullOrWhiteSpace(referer))
                {
                    request.Referer = referer;
                }
                if (!string.IsNullOrWhiteSpace(cookies))
                {
                    string domain = new Uri(url).Host;
                    request.CookieContainer = new CookieContainer();
                    request.CookieContainer.Add(parseCookieString(cookies, domain));
                }

                if (!string.IsNullOrWhiteSpace(customHeaders))
                {
                    request.Headers.Add(parseHeadersString(customHeaders));
                }

                //Получаем ответ от интернет-ресурса.

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                //Экземпляр класса System.IO.Stream
                //для чтения данных из интернет-ресурса.
                Stream dataStream = response.GetResponseStream();

                string responsereader;
                try
                {
                    Stream str;
                    if (useGZip)
                    {
                        str = new GZipStream(dataStream, CompressionMode.Decompress);
                    }
                    else
                    {
                        str = dataStream;
                    }

                    //Инициализируем новый экземпляр класса
                    //System.IO.StreamReader для указанного потока.
                    StreamReader sreader = new StreamReader(str, Encoding.UTF8, true);

                    //Считывает поток от текущего положения до конца.
                    responsereader = sreader.ReadToEnd();
                    sreader.Close();
                }
                catch (InvalidDataException)
                {
                    //Инициализируем новый экземпляр класса
                    //System.IO.StreamReader для указанного потока.
                    StreamReader sreader = new StreamReader(dataStream, Encoding.UTF8, true);

                    //Считывает поток от текущего положения до конца.
                    responsereader = sreader.ReadToEnd();
                    sreader.Close();
                }
                //Закрываем поток ответа.
                response.Close();

                //запоминание времени запроса
                lastQuery = DateTime.Now;

                //код ошибки
                code = response.StatusCode;

                //запись в кэш, если надо
                if (useCache && !forceDisableCache)
                {
                    cache.PutWebUrl(url, responsereader);
                }

                return(responsereader);
            }
            catch (WebException we)
            {
                if (we.Status == WebExceptionStatus.NameResolutionFailure)
                {
                    throw new WebException("Ошибка подключения к DNS, проверьте соединение с интернетом", we);
                }
                if (we.Response == null)
                {
                    throw new WebException("Сервер не отвечает, попробуйте позже", we);
                }
                var Hcode = (we.Response as HttpWebResponse).StatusCode;
                if ((int)Hcode >= 500 && (int)Hcode <= 505)
                {
                    throw new ApplicationException("Внутрення ошибка сервера. Попробуйте позже", we);
                }
                throw new WebException("Ошибка подключения.\r\n" + url, we);
            }
        }