Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Подключение к LongPoll серверу vk.com


Автор: maxnoskov 23.10.2014, 21:07
Подскажите пожалуйста, как правильно организовать подключение к LongPoll серверу вконтакте. Из документации:
Цитата

Для подключения Вам нужно составить запрос следующего вида:
http://{$server}?act=a_check&key={$key}&ts={$ts}&wait=25&mode=2 

Где вместо {$...} - соответствующий параметр, полученный методом messages.getLongPollServer  


Все параметры имеются в наличии.

Цитата

Принцип работы Long Poll соединения заключается в том, что сервер, получив запрос, удерживает его до тех пор, пока не произойдёт событие или не истечёт время, указанное в параметре wait (Так как некоторые прокси серверы обрывают соединение по истечении 30 секунд - мы советуем указывать wait=25).
  

Как реализовать post запрос и ожидание ответа сервера в течение 25 секунд, не могу разобраться.

Цитата

Как только клиент получает ответ, он может послать новый запрос, указав в параметре ts новое значение, полученное в ответе, для получения новых событий.  

Автор: WERITAS 24.10.2014, 12:33
POST-запрос можно организовать двумя способами: через TcpClient и через HttpWebRequest. Вы каким способом пробовали? У вас есть пример сессии (запрос-ответ) для подключения к серваку?

Автор: maxnoskov 24.10.2014, 12:46
Через HttpWebResponse
Код

public static HttpWebResponse PostMethod(string postedData, string postUrl)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl);
            request.Method = "POST";
            request.Timeout = 25000;
            request.Credentials = CredentialCache.DefaultCredentials;

            UTF8Encoding encoding = new UTF8Encoding();
            var bytes = encoding.GetBytes(postedData);

            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = bytes.Length;

            using (var newStream = request.GetRequestStream())
            {
                newStream.Write(bytes, 0, bytes.Length);
                newStream.Close();
            }
            return (HttpWebResponse)request.GetResponse();
        }

И потом 
Код

var resp = PostMethod("?act=a_check&key=" + response.Key +"&ts=" + response.Ts + "&wait=25&mode=2", "http://" + response.Server);
            var strreader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
            var respstring = strreader.ReadToEnd();

Ответ соответственно пустой

Автор: WERITAS 27.10.2014, 06:01
В снифере не пробовали смотреть? Вообще сервак хоть что-то отвечает? Каковы значения полей resp.StatusCode и resp.StatusDescription?

Автор: maxnoskov 27.10.2014, 11:39
Цитата(WERITAS @ 27.10.2014,  06:01)
В снифере не пробовали смотреть? Вообще сервак хоть что-то отвечает? Каковы значения полей resp.StatusCode и resp.StatusDescription?

Странное дело, попробывал через WebClient. Если всю строку указывать в ApiUrl, то работает, но если разбивать на ApiUrl и data, то пустой ответ.

Код

//Url запроса
var ApiUrl = "http://" + response.Server + "?act=a_check&key=" + response.Key + "&ts=" + response.Ts + "&wait=25&mode=2";
//Данные для запроса - пока пустые
string data = "";

WebClient client = new WebClient();
// Указываем кодировку
client.Encoding = System.Text.Encoding.UTF8;
// Отправляем запрос и получаем ответ
string reply = client.UploadString(ApiUrl, data);

Автор: WERITAS 27.10.2014, 17:43
Цитата(maxnoskov @  24.10.2014,  12:46 Найти цитируемый пост)
 var strreader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8); var respstring = strreader.ReadToEnd();

Попробуйте вместо вызова метода strreader.ReadToEnd();читать порциями типа так:
Код

List<string> strList = new List<string>();
string line = strreader.ReadLine();
while (line != null)
{
     strList.Add(line);
     line = streamReader.ReadLine();
     if (strList.Count == 3000)
    break;
}

Каковы значения полей resp.StatusCode и resp.StatusDescription? 

Цитата(maxnoskov @  27.10.2014,  11:39 Найти цитируемый пост)
Странное дело, попробывал через WebClient. Если всю строку указывать в ApiUrl, то работает,

В сниффере сравните запросы в первом и втором случаях, может быть какого-нибудь заголовка не хватает (или наоборот лишний).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)