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