С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/95: Рейтинг темы: голосов - 95, средняя оценка - 4.76
34 / 34 / 5
Регистрация: 20.09.2010
Сообщений: 53

HttpWebRequest асинхронный post запрос

25.01.2011, 17:14. Показов 19800. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно создать post запрос и послать его асинхронно
делаю это вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.ya.ru/");
request.Method = "post";
 
string data = "test";
request.ContentLength = data.Length;
 
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(data);
writer.Close();
 
Console.WriteLine("Посылаем запрос");
request.BeginGetResponse((asyncResult) =>
{
    WebResponse response = request.EndGetResponse(asyncResult);
    Console.WriteLine("ответ получен");
    StreamReader reader = new StreamReader(response.GetResponseStream());
    string str = reader.ReadToEnd();
}, null);
Console.WriteLine("Запрос послан");
Проблема в том, что запрос посылается не асинхронно, метод BeginGetResponse не возвращается сразу же, а ждет ответа от сервера, в таком случает не никакого смысла использовать BeginGetResponse. Если создать обычный get запрос то все работает как нужно.
Это какая-то особенность WebRequest или это я что-то делаю не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.01.2011, 17:14
Ответы с готовыми решениями:

Post запрос HttpWebRequest через прокси socks5
Есть код простого пост запроса string POST(string url, string data) { HttpWebRequest request =...

Не получается POST-запрос с передачей файлов через HttpWebRequest
пытаюсь сделать POST-запрос типа MIME на сайт... должен передавать несколько файлов и значение одной переменной... не получается даже с...

HttpWebRequest Post
Здравствуйте. Помогите разобраться новичку. Вообщем написал я небольшую програмку, которая может авторизироваться на сайте и отправлять...

7
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
26.01.2011, 10:06
Примечание
В приложении не могут совместно использоваться синхронные и асинхронные методы для определенного запроса. Если необходимо вызвать метод BeginGetRequestStream, следует использовать метод BeginGetResponse для получения ответа.
http://msdn.microsoft.com/ru-r... ponse.aspx
Нужно сделать как-то так:
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
using System;
using System.IO;
using System.Net;
 
namespace ConsoleApplicationTest {
    public static class Program {
        private static void Main() {
            var request = (HttpWebRequest)WebRequest.Create( "http://msdn.microsoft.com/ru-ru/library/2e08f6yc.aspx" );
            request.Method = "post";
 
            string data = "test";
            request.ContentLength = data.Length;
 
            IAsyncResult getRequestStream = request.BeginGetRequestStream( null, null );
            var writer = new StreamWriter( request.EndGetRequestStream( getRequestStream ) );
            writer.Write( data );
            writer.Close();
 
            Console.WriteLine( "Посылаем запрос" );
            request.BeginGetResponse( OnAsyncCallback, request );
            Console.WriteLine( "Запрос послан" );
 
            Console.ReadKey();
        }
 
        private static void OnAsyncCallback( IAsyncResult asyncResult ) {
            var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
            WebResponse response = httpWebRequest.EndGetResponse( asyncResult );
            Console.WriteLine( "ответ получен" );
            var reader = new StreamReader( response.GetResponseStream() );
            string str = reader.ReadToEnd();
            Console.WriteLine( str );
        }
    }
}
Асинхронное программирование с использованием делегатов.
2
34 / 34 / 5
Регистрация: 20.09.2010
Сообщений: 53
26.01.2011, 10:46  [ТС]
Спасибо, теперь я разобрался.
0
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 8
15.02.2011, 14:31
В прошлом посте показано как послать запрос асинхронно у меня примерно такая же задача. Нужно послать асинхронно запросы по 10 url из коллекции. А потом собрать ответы желательно так же в коллекцию для дальнейшей работы с ними. Как это сделать??
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
15.02.2011, 17:28
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading;
 
namespace ConsoleApplicationTest {
    public static class Program {
        private static void Main() {
            var uris = new[] {
                new Uri( "https://www.cyberforum.ru/csharp-net/thread233893.html" ),
                new Uri( "http://gandjustas.blogspot.com/2009/03/blog-post.html" ),
                new Uri( "http://msug.vn.ua/Posts/Details/4203" ),
            };
 
            IEnumerable<IAsyncResult> asyncResults = uris
                .Select( uri => (HttpWebRequest)WebRequest.Create( uri ) )
                .Select( webRequest => webRequest.BeginGetResponse( null, webRequest ) );
 
            Console.WriteLine( "Ожидаем завершения запросов." );
 
            WaitHandle[] handles = asyncResults.Select( asyncResult => asyncResult.AsyncWaitHandle ).ToArray();
            WaitHandle.WaitAll( handles );
 
            Console.WriteLine( "Получаем данные." );
 
            var result = asyncResults
                .Select( asyncResult => {
                    var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
                    HttpWebResponse response;
                    try {
                        response = (HttpWebResponse)httpWebRequest.EndGetResponse( asyncResult );
                    }
                    catch ( Exception e ) {
                        return e.Message;
                    }
                    Stream responseStream = response.GetResponseStream();
                    if ( responseStream == null ) {
                        return "responseStream not available";
                    }
                    using ( var reader = new StreamReader( responseStream ) ) {
                        return reader.ReadToEnd();
                    }
                } );
 
            foreach ( string s in result ) {
                Console.WriteLine( s.Substring( 0, 200 ) );
                Console.WriteLine( "----------------------------" );
            }
 
            Console.ReadKey();
        }
    }
}
Если стоит четвёртый фреймворк:
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading;
 
namespace ConsoleApplicationTest {
    public static class Program {
        private static void Main() {
            var uris = new[] {
                new Uri( "https://www.cyberforum.ru/csharp-net/thread233893.html" ),
                new Uri( "http://gandjustas.blogspot.com/2009/03/blog-post.html" ),
                new Uri( "http://msug.vn.ua/Posts/Details/4203" ),
            };
 
            IEnumerable<IAsyncResult> asyncResults = uris
                .Select( uri => (HttpWebRequest)WebRequest.Create( uri ) )
                .Select( webRequest => webRequest.BeginGetResponse( null, webRequest ) );
 
            Console.WriteLine( "Ожидаем завершения запросов." );
 
            WaitHandle[] handles = asyncResults.Select( asyncResult => asyncResult.AsyncWaitHandle ).ToArray();
            WaitHandle.WaitAll( handles );
 
            Console.WriteLine( "Получаем данные." );
 
            ParallelQuery<string> result = asyncResults
                .AsParallel()
                .WithDegreeOfParallelism( handles.Length )
                .AsUnordered()
                .Select( asyncResult => {
                    var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
                    HttpWebResponse response;
                    try {
                        response = (HttpWebResponse)httpWebRequest.EndGetResponse( asyncResult );
                    }
                    catch ( Exception e ) {
                        return e.Message;
                    }
                    Stream responseStream = response.GetResponseStream();
                    if ( responseStream == null ) {
                        return "responseStream not available";
                    }
                    using ( var reader = new StreamReader( responseStream ) ) {
                        return reader.ReadToEnd();
                    }
                } );
 
            result.ForAll( s => {
                Console.WriteLine( s.Substring( 0, 200 ) );
                Console.WriteLine( "----------------------------" );
            } );
 
            Console.ReadKey();
        }
    }
}
Или вообще так:
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
using System;
using System.IO;
using System.Linq;
using System.Net;
 
namespace ConsoleApplicationTest {
    public static class Program {
        private static void Main() {
            var uris = new[] {
                new Uri( "https://www.cyberforum.ru/csharp-net/thread233893.html" ),
                new Uri( "http://gandjustas.blogspot.com/2009/03/blog-post.html" ),
                new Uri( "http://msug.vn.ua/Posts/Details/4203" ),
            };
 
            ParallelQuery<string> result = uris
                .AsParallel()
                .WithDegreeOfParallelism( uris.Length )
                .AsUnordered()
                .Select( uri => (HttpWebRequest)WebRequest.Create( uri ) )
                .Select( webRequest => {
                    HttpWebResponse response;
                    try {
                        response = (HttpWebResponse)webRequest.GetResponse();
                    }
                    catch ( Exception e ) {
                        return e.Message;
                    }
                    Stream responseStream = response.GetResponseStream();
                    if ( responseStream == null ) {
                        return "responseStream not available";
                    }
                    using ( var reader = new StreamReader( responseStream ) ) {
                        return reader.ReadToEnd();
                    }
                } );
 
            result.ForAll( s => {
                Console.WriteLine( s.Substring( 0, 200 ) );
                Console.WriteLine( "----------------------------" );
            } );
 
            Console.ReadKey();
        }
    }
}
1
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 8
16.02.2011, 08:50
Вот это спасибо. Буду эксперементировать.
0
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
18.09.2014, 13:43
Несмотря, что тема старая - апну её. В последних примерах показали асинхронное получение информации с пачки урлов, однако не показано, как отправить туда POST запрос. Помогите, модифицировать последний пример так, чтобы запрос шёл на один URI, но в каждый POST запрос можно было бы передавать свои данные.
0
22 / 20 / 5
Регистрация: 29.02.2016
Сообщений: 590
09.08.2016, 18:25
помогите! можно то, что у вас в консоль лог капает слить в публичную переменную, чтоб её содержимое где-нить юзать? или просто, можно как-то вернуть значение str? я использую ваше решение в программе с формами)
C#
1
2
3
4
5
6
7
8
        private static void OnAsyncCallback( IAsyncResult asyncResult ) {
            var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
            WebResponse response = httpWebRequest.EndGetResponse( asyncResult );
            Console.WriteLine( "ответ получен" );
            var reader = new StreamReader( response.GetResponseStream() );
            string str = reader.ReadToEnd();
            Console.WriteLine( str );
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2016, 18:25
Помогаю со студенческими работами здесь

Удваивание POST данных при httpwebrequest
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = &quot;POST&quot;; req.Timeout = 30000; req.ContentType =...

Запрос HttpWebRequest через прокси
Всем привет. Делаю запрос проходящий через прокси. Делаю вот так: HttpWebRequest request =...

HttpWebRequest добавление данных в запрос
Нужно авторизироваться на сервере. Через прокси посмотрел, что такой запрос нужно создать: POST http://site.ru/admin.php HTTP/1.0 ...

HttpWebRequest любой запрос возвращает 403
WebRequest reqGET = (HttpWebRequest)WebRequest.Create(&quot;https://www.fl.ru/&quot;); WebResponse resp = reqGET.GetResponse(); ...

HttpWebRequest: ПОСТ-запрос, не формируется multipart/form-data
Добрый ... Есть проблема с формировкой запроса в формате multipart/form-data Сервер не может разбить данные на имена и значения ,то...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru