Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/81: Рейтинг темы: голосов - 81, средняя оценка - 4.68
33 / 33 / 5
Регистрация: 20.09.2010
Сообщений: 53
1

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

25.01.2011, 17:14. Просмотров 16275. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2011, 17:14
Ответы с готовыми решениями:

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

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

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

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

7
811 / 702 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
26.01.2011, 10:06 2
Примечание
В приложении не могут совместно использоваться синхронные и асинхронные методы для определенного запроса. Если необходимо вызвать метод 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
33 / 33 / 5
Регистрация: 20.09.2010
Сообщений: 53
26.01.2011, 10:46  [ТС] 3
Спасибо, теперь я разобрался.
0
2 / 2 / 0
Регистрация: 09.02.2011
Сообщений: 8
15.02.2011, 14:31 4
В прошлом посте показано как послать запрос асинхронно у меня примерно такая же задача. Нужно послать асинхронно запросы по 10 url из коллекции. А потом собрать ответы желательно так же в коллекцию для дальнейшей работы с ними. Как это сделать??
0
811 / 702 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
15.02.2011, 17:28 5
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 6
Вот это спасибо. Буду эксперементировать.
0
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
18.09.2014, 13:43 7
Несмотря, что тема старая - апну её. В последних примерах показали асинхронное получение информации с пачки урлов, однако не показано, как отправить туда POST запрос. Помогите, модифицировать последний пример так, чтобы запрос шёл на один URI, но в каждый POST запрос можно было бы передавать свои данные.
0
18 / 17 / 4
Регистрация: 29.02.2016
Сообщений: 543
09.08.2016, 18:25 8
помогите! можно то, что у вас в консоль лог капает слить в публичную переменную, чтоб её содержимое где-нить юзать? или просто, можно как-то вернуть значение 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2016, 18:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

HttpWebRequest добавление данных в запрос
Нужно авторизироваться на сервере. Через прокси посмотрел, что такой запрос нужно создать: POST...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.