Обработка HttpResponseMessage с постоянным соединением c # - PullRequest
0 голосов
/ 15 февраля 2019

Я использую Httpclient C # .net для подключения к URL.

Мне нужно сделать запрос GET.Эта связь постоянна.Проблема в том, что мне нужно выполнять действия в соответствии с уведомлениями, которые отправляет мне сервер.

При выполнении HttpResponseMessage он зависает (будучи постоянным, он работает и постоянно получает уведомления, но никогда не возвращает меня обратно).контролировать, чтобы иметь возможность работать в соответствии с уведомлениями сервера) при отмене выполнения я вижу все уведомления через консоль.

Есть ли способ контролировать HttpResponseMessage, чтобы иметь возможность работать с каждым ответомсервер посылает мне?

Должен ли я использовать для этого другой тип технологии?

Это то, что я получаю обратно через консоль de "await response.Content.ReadAsStringAsync ();", когда я отменяю операцию.

<? xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<message xmlns = "http://asdasd.com/asd/08/DS/Sync" xmlns: ns2 = "http: // asdadasdasdasd">
<event> KEEPALIVE </ event>
</ message>

<? xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<message xmlns = "http://asdasd.com/asd/08/DS/Sync" xmlns: ns2 = "http: // asdadasdasdasd">
<event> KEEPALIVE </ event>
</ message>

<? xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<message xmlns = "http://asdasd.com/asd/08/DS/Sync" xmlns: ns2 = "http: // asdadasdasdasd">
<event> KEEPALIVE </ event>
</ message>

Каждое («сообщение») приходит примерно каждые 2 минуты. Мне бы хотелось, чтобы каждый раз, когда я его получал, я мог выполнять действие и оставлял код ultilizo.Спасибо

public async static Task<int> GetRequest(string url)
{
    HttpClient client = new HttpClient();
    HttpResponseMessage response = new HttpResponseMessage();
    response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
    Console.WriteLine("STATUS OF CONNECTION");
    Console.WriteLine(response.StatusCode);
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync().ConfigureAwait(continueOnCapturedContext: false); ;

    Console.WriteLine("ANSWER");
    Console.WriteLine(body);
    Console.WriteLine(" \n");
    Console.WriteLine("\n ATTENTION!! Disconnected from the Persistence line \n");

    Console.WriteLine("Connections done");
    int result1 = 1;
    return result1;
}

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Вы хотите проанализировать частичные ответы HTTP, , как и когда каждая часть получена .Протокол HTTP не знает / не понимает, что вы отправляете / получаете несколько отдельных сообщений, разделенных новой строкой в ​​одном HTTP-ответе.

Насколько я знаю, HttpClient не очень вам поможетпотому что он предназначен для получения одного целого HTTP-ответа.Рик Страл ведет блог именно на эту тему Использование .NET HttpClient для захвата частичных ответов .

Вы должны иметь возможность использовать HttpWebRequest для ручного считывания байтов из сетевого потока в буфер,После добавления в буфер вы захотите проверить, содержит ли оно полное сообщение (<message> ... </ message>).Если это так, преобразуйте сообщение в строку и объявите его при необходимости: например, вызвать событие, запустить задачу, вызвать метод, добавить в очередь.Затем очистите буфер и повторите.

TcpClient, вероятно, не лучший подход в этом сценарии, поскольку тогда вам также может понадобиться реализовать TLS (если ваша конечная точка HTTPS).

0 голосов
/ 16 февраля 2019

Согласно MSDN , вам не нужно создавать новый HttpClinet для каждого запроса, HttpClient предназначен для создания одного экземпляра и повторного использования в течение всей жизни приложения.Создание класса HttpClient для каждого запроса приведет к исчерпанию количества сокетов, доступных при больших нагрузках. Далее вы можете указать время ожидания по умолчанию для httpClient или использовать его для каждого запроса.Затем вы используете опцию ResponseHeadersRead, это означает Операция должна завершиться, как только ответ станет доступен и заголовки прочитаны.Содержимое еще не прочитано. Попробуйте переключиться на ResponseContentRead вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...