141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
1

Замена WebClient в .NET Compact Framework

01.07.2015, 19:18. Показов 2711. Ответов 11

Я использую WebClient для авторизации при помощи куки на веб-сервисе, но в Compact Framework WebClient не поддерживается.

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
class CookieWebClient : WebClient
{
    public CookieContainer CookieContainer { get; private set; }
 
 
    public CookieWebClient()
    {
        this.CookieContainer = new CookieContainer();
    }
 
 
    public CookieWebClient(CookieContainer cookieContainer)
    {
        this.CookieContainer = cookieContainer;
    }
 
    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address) as HttpWebRequest;
        if (request == null) return base.GetWebRequest(address);            
        request.Timeout = 30000;
        request.CookieContainer = CookieContainer;
        return request;
    }
}
Чем можно заменить этот код, чтобы можно было принять куки и продолжать работать с веб-сервисом, авторизовавшись?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2015, 19:18
Ответы с готовыми решениями:

.NET Compact Framework и поворот формы
Возникли некоторые трудности при разработке приложения под Windows Mobile 6. По плану, при повороте...

[Compact Framework] Ошибка при использовании OpenNETCF.Net.Ftp.FTPWebResponse(): NullReferenceException
Доброго времени суток господа! Вопрос следующий. Использую Compact Framework и для работы с FTP...

Запуск приложения на платформе .NET Framework 4.0, на другом компьютере без установки .NET Framework 4.0
Как запустить приложение на платформе .NET Framework 4.0, на другом компьютере без установки .NET...

Settings проекта после перебилда с Net Framework 4.0 на Net Framework 3.0
У меня возникла следующая проблема: Если создать проект WinForms под Net Framework 4.0,...

11
Администратор
Эксперт .NET
15390 / 12398 / 4939
Регистрация: 17.03.2014
Сообщений: 25,140
Записей в блоге: 1
01.07.2015, 19:29 2
Alex9, попробуй portable HttpClient.
1
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
01.07.2015, 21:14  [ТС] 3
OwenGlendower, нужно, чтобы поддерживалось в VS2008.
0
Администратор
Эксперт .NET
15390 / 12398 / 4939
Регистрация: 17.03.2014
Сообщений: 25,140
Записей в блоге: 1
01.07.2015, 21:19 4
Alex9, не знаю такого. Надо искать. Как вариант - взять исходники portable HttpClient и попробовать откомпилировать под .NET 3.5.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
01.07.2015, 22:29 5
Alex9, держи с бонусом Работает, начиная .NET 2.0

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
public class CookieWebClient
    {
        public CookieContainer CookieContainer { get; private set; }
 
        public CookieWebClient()
        {
            this.CookieContainer = new CookieContainer();
        }
 
        public CookieWebClient(CookieContainer cookieContainer)
        {
            this.CookieContainer = cookieContainer;
        }
 
        public HttpWebRequest CreateRequest(Uri uri)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
 
            request.Method = "GET";
            request.CookieContainer = CookieContainer;
            request.Timeout = System.Threading.Timeout.Infinite;
 
            return request;
        }
 
        public HttpWebResponse CreateResponse(HttpWebRequest request)
        {
            HttpWebResponse response = null;
 
            try
            {
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                response = (HttpWebResponse)ex.Response;
                if (response == null)
                    throw;
            }
            finally
            {
                if (response != null)
                {
                    if (response.StatusCode != HttpStatusCode.OK)
                        throw new WebException("Response answer is not OK");
 
                    if ((int)response.StatusCode >= 500)
                    {
                        response.Close();
                        throw new WebException(string.Format("Client received error response from server. Status code: {0}.", response.StatusCode), WebExceptionStatus.ReceiveFailure);
                    }
                }
            }
 
            return response;
        }
 
        public HttpWebResponse CreateResponse(HttpWebRequest request, out string responseData)
        {
            HttpWebResponse response = CreateResponse(request);
            StringBuilder sb = new StringBuilder();
            using (var stream = response.GetResponseStream())
            {
                int readCount;
                int count = 1024;
                byte[] buffer = new byte[count];
                while ((readCount = stream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    sb.Append(Encoding.UTF8.GetString(buffer, 0, readCount));
                }
            }
 
            responseData = sb.ToString();
            return response;
        }
1
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
02.07.2015, 08:40  [ТС] 6
LostCoast, а можно пример использования этого класса - авторизацию по юрл и затем загрузку страницы, требующей авторизации?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
02.07.2015, 09:41 7
Лучший ответ Сообщение было отмечено Alex9 как решение

Решение

Как-то так:

HTTP обработчик:
Кликните здесь для просмотра всего текста
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
public static class HTTPRequester
    {
        public static HttpWebRequest CreateRequest(string uri, string method)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
 
            request.Method = method;
            request.CookieContainer = new CookieContainer();
            request.Timeout = System.Threading.Timeout.Infinite;
 
            return request;
        }
 
        public static HttpWebResponse CreateResponse(HttpWebRequest request)
        {
            HttpWebResponse response = null;
 
            try
            {
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                response = (HttpWebResponse)ex.Response;
                if (response == null)
                    throw;
            }
            finally
            {
                if (response != null)
                {
                    if (response.StatusCode != HttpStatusCode.OK)
                        throw new WebException("Response answer is not OK");
 
                    if ((int)response.StatusCode >= 500)
                    {
                        response.Close();
                        throw new WebException(string.Format("Client received error response from server. Status code: {0}.", response.StatusCode), WebExceptionStatus.ReceiveFailure);
                    }
                }
            }
 
            return response;
        }
 
        public static HttpWebResponse CreateResponse(HttpWebRequest request, out string responseData)
        {
            HttpWebResponse response = CreateResponse(request);
            StringBuilder sb = new StringBuilder();
            using (var stream = response.GetResponseStream())
            {
                int readCount;
                int count = 1024;
                byte[] buffer = new byte[count];
                while ((readCount = stream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    sb.Append(Encoding.UTF8.GetString(buffer, 0, readCount));
                }
            }
 
            responseData = sb.ToString();
            return response;
        }
 
        public static HttpWebResponse CreateGETRequest(string uri, Cookie cookie, out string responseData)
        {
            HttpWebRequest request = CreateRequest(uri, WebRequestMethods.Http.Get);
            request.CookieContainer.Add(cookie);
            return CreateResponse(request, out responseData);
        }
 
        public static HttpWebResponse CreatePOSTRequest(string uri, string contentType, string postBody, out string responseData)
        {
            HttpWebRequest request = CreateRequest(uri, WebRequestMethods.Http.Post);
            request.ContentType = contentType;
 
            using (var sw = new StreamWriter(request.GetRequestStream()))
            {
                sw.Write(postBody);
                sw.Flush();
                sw.Close();
            }
 
            return CreateResponse(request, out responseData);
        }
    }


Использование:

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
class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Cookie cookie = null;
                string postData = string.Empty;
 
                using (HttpWebResponse response = HTTPRequester.CreatePOSTRequest("http://localhost:8080/login", "application/x-www-form-urlencoded", "login=123&password=321", out postData))
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        cookie = response.Cookies["SID"];
                    }
                }
 
                if (cookie != null)
                {
                    using (HttpWebResponse response = HTTPRequester.CreateGETRequest("http://localhost:8080/index.html", cookie, out postData))
                    {
                        if (response.StatusCode == HttpStatusCode.OK)
                        {
                            Console.WriteLine(postData);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
 
            Console.ReadKey();
        }
    }
Тут не хватает доп. проверок, но это уже сами все под себя сделаете.
1
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
02.07.2015, 12:39  [ТС] 8
Спасибо всем. Попробую разобраться.
0
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
05.07.2015, 20:27  [ТС] 9
C#
1
Cookie cookie = null;
А это откуда берётся?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
06.07.2015, 09:50 10
Alex9, это просто переменная для сохранения сессионной куки, чтобы дальше ее посылать в запросах. Иначе, веб сервер будет требовать от вас авторизации.
1
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
06.07.2015, 12:37  [ТС] 11
LostCoast, можно ли что-то другое использовать? Похоже, что System.Net для Compact Framework не содержит типа Cookie.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
06.07.2015, 12:55 12
Alex9,

https://msdn.microsoft.com/en-... .110).aspx

Список версий, где поддерживается этот класс:

.NET Framework
Supported in: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1
.NET Framework Client Profile
Supported in: 4, 3.5 SP1
Portable Class Library
Supported in: Portable Class Library
Supported in: Windows Phone 8.1
Supported in: Windows Phone Silverlight 8.1
Supported in: Windows Phone Silverlight 8

Может у вас в чем-то другом ошибка?

Но, если уж интересно, то вы можете сами распарсить заголовок Set-Cookie в ответе.

Например, string rawCookie = response.Headers["Set-Cookie"];

На заголовков "Set-Cookie" может быть несколько, это надо учитывать.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2015, 12:55
Помогаю со студенческими работами здесь

Подключить к проекту (NET Framework 4) библиотеку на NET Framework 2
Суть вопроса такова, мне надо использовать в программе одну библиотеку но она написана и...

Перетаскивание контрола в Compact Framework
Пишу приложение под Windows Mobile 5.0. Использую C# и .Net Compact Framework 2.0. Задача проста -...

Compact FrameWork 3.5 для Pocket PC
Подсажите пожалуста как пользоваться вот этой платформой. Установил ее на компьютер. Зашел в Visual...

В списке Target Framework не выбирается .NET Framework 4 только .NET Framework 4 Client Profile
Свойства проекта (Project -> Properties) -> вкладка Compile -> Advenced complie options -> в списке...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru