Автоматизация бизнеса

Пользовательский поиск

пятница, 20 апреля 2012 г.

WebRequest и WebResponse

Пространства имен System.Net предлагает нам классы WebRequest и WebResponse, которые как и WebClient позволяют загружать Web-страницы. Эти классы позволяют решать более серьезные задачи чем WebClient, например вопросы связанные с аутентификацией.
Теперь посмотрим пример как с помощью классов WebRequest и WebResponse загрузить Web-страницу, а также, как можно воспользоваться преимуществами дополнительных свойств HTTP.

            WebRequest wreq = WebRequest.Create("http://soft-a.pro");
            WebResponse wresp = wreq.GetResponse();
            Stream stream = wresp.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            string L;
            while ((L = sr.ReadLine()) != null)
            {
                listBox1.Items.Add(L);

            }
            sr.Close();
            wresp.Close();




У класса WebRequest нету конструктора, и для создания объекта надо вызвать статический метод WebRequest.Create(). Класс WebRequest представляет запрос информации для отправки по определенному URI, и это передается в качестве параметра методу Create().  А класс WebResponse представляет данные из сервера. У класса WebResponse  есть метод GetResponse()  с помощью которого выполняется запрос к серверу и возвращает объект WebResponse, получающий возвращенные данные. А также можем получить поток, представляющий данные, но для этого надо воспользоваться методом GetResponseStream() класса WebResponse.
Классы WebRequest и WebResponse предусматривают поддержку чтения заголовочной информации. Есть классы-наследники которые представляют дополнительную информацию, которая специфична для протокола HTTP. Это классы HttpWebRequest, HttpWebResponse. Всегда можно полученный экземпляр WebRequest к типу HttpWebRequest, и после этого можно получить доступ к свойствам, специфичным для протокола HTTP. Множество свойств заголовка можно получить и посмотреть в следующем примере.

            WebRequest wreq = WebRequest.Create("http://soft-a.pro");
            WebResponse wresp = wreq.GetResponse();
            HttpWebRequest httpwreq = (HttpWebRequest)wreq;
            listBox1.Items.Add("Request Timeout (ms): " + httpwreq.Timeout);
            listBox1.Items.Add("Request AllowRedirect : " + httpwreq.AllowAutoRedirect);
            listBox1.Items.Add("Request KeepAlive : " + httpwreq.KeepAlive);
            listBox1.Items.Add("Request URI : " + httpwreq.RequestUri);

Здесь Timeout измеряется в миллисекундах, его значение по умолчанию 100 000. Можно изменить значение этого свойства, чтобы управлять тем, насколько долго WebRequest будет ожидать ответа, если пройдет данное время объект возбудит исключение WebException. Для того чтобы узнать причину исключения необходимо всего лишь проверить значение свойства WebException.Status.
KeepAlive специфичное свойство протокола HTTP, поэтому доступ к нему можно получить через HttpWebRequest. Данное свойство позволяет множеству запросов использовать одно и то же соединение, что экономит время. По умолчанию значение этого свойства True.

Классы запросов и ответов размещают большинство важнейших заголовков в свойствах, но можно обратиться к самому свойству Headers для просмотра набора всех заголовков.

         
            WebRequest wrq = WebRequest.Create(txtUri.Text);
            WebResponse wrs = wrq.GetResponse();
            WebHeaderCollection whc = wrs.Headers;
            for (int i = 0; i < whc.Count; i++)
            {
                listBox1.Items.Add("Header " + whc.GetKey(i) + ":" + whc[i]);
            }

Аутентификация для  WebRequest.

Credentials еще одно свойство класса WebRequest. Если необходимо добавить аутинцифирующую информацию в запрос, надо создать экземпляр класса NeworkCredentials с именем и паролем.
           
            NetworkCredential credit = new NetworkCredential("USERNAME", "PASSWORD");
            wreq.Credentials = credit;

Но данный код необходимо добавить до вызова метода GetResponse()

WebRequest.GetResponse() не возвращает управление до тех пор, пока не придет полный ответ от сервера. Если Вам такое обстоятельство не удобно, то Вы должны использовать методы BeginGetResponse() и EndGetResponse(). Метод BeginGetResponse() работает асинхронно и возвращает управление мгновенно. BeginGetResponse() возвращает объект реализующий интерфейс IAsyncResult. Интерфейс можно опрашивать или ждать момента, когда станет доступным ответ, и после вызвать метод EndGetResponse() для получения ответа.
Можно также передать делегат для обратного вызова методу BeginGetResponse(). Назначением делегата обратного вызова должен быть метод, возвращающий void и принимающий в качестве параметра интерфейс IAsyncResult.

Ниже приведен пример вышесказанного
Создайте новый проект WindowsForms, добавьте контрол Button и в событие Click напишите следующий код

         
            WebRequest wrq = WebRequest.Create("http://soft-a.pro");
            wrq.BeginGetResponse(new AsyncCallback(OnResponse), wrq);


и вдобавок создайте следующий метод


protected static void OnResponse(IAsyncResult ra)
        {
            WebRequest wreq = (WebRequest)ra.AsyncState;
            WebResponse wresp = wreq.EndGetResponse(ra);
            Stream strm = wresp.GetResponseStream();
            StreamReader sr = new StreamReader(strm);
            string line = sr.ReadToEnd();
            MessageBox.Show(line);
            strm.Close();
        }

Комментариев нет:

Отправить комментарий