Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
107 / 107 / 9
Регистрация: 19.12.2010
Сообщений: 417
1

Перегрузка WebClient.GetRequest() и передача исключения вверх по стеку

13.05.2012, 14:08. Показов 1364. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Я расширил WebClient, чтобы пользоваться Cookies и некоторыми другими вещами.
Сам класс: CookieAwareWebClient.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//CookieAwareWebClient.cs
using System;
using System.Net;
using TextAlias = System.Text;
public class CookieAwareWebClient : WebClient
{
    public CookieAwareWebClient(CookieContainer requestCookieContainer = null, string method = WebRequestMethods.Http.Get, bool allowAutoRedirect = false, int timeout = 30000, CookieReplacementType cookieReplacementType = CookieReplacementType.None, string contentType = null, string postString = null, string referer = null, string userAgent = "Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.61")
    {
        RequestCookieContainer = requestCookieContainer;
        Method = method;
        AllowAutoRedirect = allowAutoRedirect;
        Timeout = timeout;
        CookieReplacementType = cookieReplacementType;
        ContentType = contentType;
        PostString = postString;
        Referer = referer;
        UserAgent = userAgent;
    }
 
    public bool AllowAutoRedirect { get; set; }
    public CookieReplacementType CookieReplacementType { get; set; }
    public CookieContainer RequestCookieContainer { get; set; }
    public CookieCollection ResponseCookieCollection { get; private set; }
    public string ContentType { get; set; }
    public HttpWebRequest LastRequest { get; private set; }
    public HttpWebResponse LastResponse { get; private set; }
    public string Method { get; set; }
    public string PostString { get; set; }
    public string Referer { get; set; }
    public int Timeout { get; set; }
    public string UserAgent { get; set; }
 
    public void GetServerResponse(string address)
    {
        var request = GetWebRequest(new Uri(address));
        var response = GetWebResponse(request);
    }
    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address) as HttpWebRequest;
        LastRequest = request;
        if (request != null)
        {
            request.CookieContainer = RequestCookieContainer;
            request.Method = Method;
            request.AllowAutoRedirect = AllowAutoRedirect;
            request.ContentType = ContentType;
            request.Referer = Referer;
            request.Timeout = Timeout;
            request.UserAgent = UserAgent;
        }
        request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        return request;
    }
 
    protected override WebResponse GetWebResponse(WebRequest request)
    {
        if (Method == WebRequestMethods.Http.Post)
        {
            SendPOST(request, PostString);
        }
        var response = base.GetWebResponse(request) as HttpWebResponse;
        LastResponse = response;
        if (response != null)
        {
            ResponseCookieCollection = response.Cookies;
            switch (CookieReplacementType)
            {
                case CookieReplacementType.Add:
                    RequestCookieContainer.Add(ResponseCookieCollection);
                    break;
                case CookieReplacementType.Replace:
                    RequestCookieContainer = new CookieContainer();
                    RequestCookieContainer.Add(ResponseCookieCollection);
                    break;
                case CookieReplacementType.None:
                    break;
                default:
                    throw new ArgumentException("Nonsupported value.");
            }
        }
        return response;
    }
 
 
    protected virtual void SendPOST(WebRequest request, string postString = null)
    {
        if (postString != null && postString.Length > 0)
        {
            var encoding = TextAlias.Encoding.ASCII;
            var postBytes = encoding.GetBytes(postString);
 
            SendPOST(request, postBytes);
        }
    }
 
    protected virtual void SendPOST(WebRequest request, byte[] postBytes)
    {
        if (postBytes.Length > 0)
        {
            request.ContentLength = postBytes.Length;
 
            using (var newStream = request.GetRequestStream())
            {
                newStream.Write(postBytes, 0, postBytes.Length);
            }
        }
    }
}
 
public enum CookieReplacementType
{
    None, Add, Replace
}

Но, проблема в том, чтобы при возникновении исключения в CookieAwareWebClient.GetRequest() передать его наружу.
Для демонстрации проблемы покажу пример:
Пример проблемы. Program.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//Program.cs
using System;
using System.Net;
 
namespace WindowsApplication1
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Started.");
            try
            {
                Download();
                Console.WriteLine("Downloaded.");
            }
            catch (WebException e)
            {
                Console.WriteLine("Occurred: {0}.", e.Message);
            }
            finally
            {
                Console.WriteLine("Finished.");
            }
            Console.ReadLine();
        }
 
        public static string Download()
        {
            Console.WriteLine("Start: A.Download()");
            string html;
            using (var wc = new CookieAwareWebClient())
            {
                html = wc.DownloadString("http://microsoft.com/");
            }
            Console.WriteLine("End: A.Download()");
            return html;
        }
    }
}

При возникновении исключения в CookieAwareWebClient.GetRequest(), исключение по стеку должно передаться вверх в WebClient.DownloadString(), затем в Program.Download(), Program.Main() и там обработаться.
При запуске exe-файла вне Visual Studio так и происходит, а во время отладки в VS исключение возникает в CookieAwareWebClient.GetRequest() и никуда дальше передаваться не хочет. Повторная генерация исключения в CookieAwareWebClient.GetRequest() (я об re-throw: throw; ) не помогает.
Что не так? Как сделать так, чтобы исключение передавалось на верх и обрабатывалось в VS так же, как и без неё? Что я упускаю из виду? Пытался гуглить - не удалось нормально сформулировать запрос, чтобы найти что-то полезное.
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2012, 14:08
Ответы с готовыми решениями:

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: public class...

Перегрузка операция, исключения
Написать программу которая описывает иерархию классов: ошибка в программе ("недостаточно...

Правильная передача GET параметра в WebClient
Всем привет. Не знаю как правильно объяснить, но постараюсь. В общем есть сайт, который принимает...

Кеширование результата работы Webclient.DownloadStringAsync() (Windows Phone 8 Webclient)
Всем привет. Приложение для Windows Phone 8. Запускаю под дебагом. Обращаюсь на локальный...

2
107 / 107 / 9
Регистрация: 19.12.2010
Сообщений: 417
15.05.2012, 09:18  [ТС] 2
Неужели придётся писать свой WebClient на основе HttpWebRequest?
Нет идей по-лучше как можно загружать страницу, предварительно отправив POST-данные и куки, получить куки от сервера, обработать и отправить запрос вновь?
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
15.05.2012, 11:55 3
У вас похоже студия настроена на включение отладчика при возникновении пользовательских исключений.
Зайдите в Debug -> Exceptions и там снимите галочку с тех исключений, на которых вы не хотите подключать отладчик.
1
15.05.2012, 11:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2012, 11:55
Помогаю со студенческими работами здесь

Ссылки для скачивания с помощью WebClient.DownloadFile и WebClient.DownloadFileAsync
Ссылки какие должны быть, для скачивания webClient.DownloadFile и webClient.DownloadFileAsync Не...

Передача данных вверх по ветке классов (не наследование)
Добрый день. Пишу программу на QT, которая должна создавать Сцену. У сцены (или карты) есть...

Передача исключения из дочерней формы в главную
Всем привет! Простая программа: первая форма с кнопкой. По нажатию на кнопку создается вторая...

Передача исключения из одного catch-блока в другой
Всем привет! Начал тут изучать исключения в С++, хотел бы кое-что прояснить. Если я всё...

WebClient.DownloadFileAsync и WebClient.DownloadFile
Если правильно понимаю, то WebClient.DownloadFileAsync и WebClient.DownloadFile это 2 разных...

Перегрузка методов и передача аргументов
Кто может помочь с лабой? Необходимо к классам из задания лабораторной работы добавить: - не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru