【问题标题】:Handling HttpResponseMessage with persistent connection c #处理带有持久连接的 HttpResponseMessage c#
【发布时间】:2019-02-15 20:23:49
【问题描述】:

我正在使用 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;
}

【问题讨论】:

标签: c# dotnet-httpclient


【解决方案1】:

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

据我所知,HttpClient 不会对您有太大帮助,因为它旨在接收一个完整的 HTTP 响应。 Rick Strahl 有一个关于这个主题的博客Using .NET HttpClient to capture partial Responses

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

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

【讨论】:

  • 没错,这完全是我所需要的。我将不得不使用 HttpWebRequest 执行请求获取 eh 将答案保存在缓冲区中,然后从另一种方法咨询该缓冲区并分析它,我尝试这样做并告诉他们它是如何进行的,非常感谢您的回答。
【解决方案2】:

根据MSDN,您不必为每个请求创建一个新的HttpClient

HttpClient 旨在被实例化一次并在整个过程中重复使用 应用程序的生命周期。实例化 HttpClient 类 每个请求都将耗尽大量可用的套接字数量 加载。

接下来,您可以为 httpClient 指定默认超时时间,或者根据请求使用它。

那么,你正在使用ResponseHeadersRead选项,这意味着

操作应在响应可用后立即完成,并且 标题被读取。内容尚未阅读。

尝试改用ResponseContentRead

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多