使用持久连接c#

时间:2019-02-15 20:23:49

标签: c# httpclient

我正在使用Httpclient C#.net 连接到网址。

我需要发出GET请求。此连接是持久的。 问题是我需要根据服务器发送给我的通知执行操作。

在执行HttpResponseMessage时,它挂起(持久运行并不断接收通知,但是它从未使我退回控制权,无法根据服务器的通知进行工作) 取消执行时,我可以通过控制台看到所有通知。

有什么方法可以控制HttpResponseMessage使其能够处理服务器向我发送的每个响应?

我应该为此使用另一种技术吗?

这是我在取消操作时通过控制台"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分钟到达一次,我希望每次收到消息时我都可以执行一项操作 我留下那最后的代码。谢谢

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 :(得分:1)

根据MSDN,您不必为每个请求创建一个新的HttpClinet HttpClient旨在实例化一次并在应用程序的整个生命周期内重复使用。为每个请求实例化HttpClient类将耗尽在重负载下可用的套接字数量。 接下来,您可以为httpClient指定默认超时,或者根据每个请求使用它。 然后,您正在使用ResponseHeadersRead选项,这意味着该操作应在响应可用并读取标头后立即完成。内容尚未读取。尝试改为切换到ResponseContentRead

答案 1 :(得分:1)

您希望解析部分HTTP响应,在接收到每个部分时以及时。 HTTP协议不知道/不知道您在单个HTTP响应中发送/接收由换行符分隔的多个离散消息。

据我所知,HttpClient对您没有太大帮助,因为它旨在接收一个完整的HTTP响应。里克·斯特拉尔(Rick Strahl)的博客完全是关于Using .NET HttpClient to capture partial Responses这个主题的。

您应该能够使用HttpWebRequest来将字节从网络流中手动读取到缓冲区中。追加到缓冲区后,您将要检查缓冲区是否包含完整的消息(<message> ... </ message>)。如果是这样,请将消息转换为字符串并根据需要进行公告:例如引发事件,启动任务,调用方法,添加到队列。然后清除缓冲区并重复。

TcpClient可能不是这种情况下的最佳方法,因为您可能还需要实现TLS(如果端点是HTTPS)。