Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用持久连接c处理HttpResponseMessage#_C#_Dotnet Httpclient - Fatal编程技术网

C# 使用持久连接c处理HttpResponseMessage#

C# 使用持久连接c处理HttpResponseMessage#,c#,dotnet-httpclient,C#,Dotnet Httpclient,我正在使用Httpclient C#.net 连接到url 我需要提出一个GET请求。此连接是持久的。 问题是我需要根据服务器发送给我的通知执行操作 当执行HttpResponseMessage时,它会挂起(由于是持久性的,它会持续工作并接收通知,但它不会让我返回控制权,以便能够根据服务器的通知工作) 取消执行时,我可以通过控制台查看所有通知 有没有办法控制HttpResponseMessage,以便能够处理服务器发送给我的每个响应 我应该为此使用另一种技术吗 这是我取消操作时通过控制台de“w

我正在使用Httpclient C#.net 连接到url

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

当执行
HttpResponseMessage
时,它会挂起(由于是持久性的,它会持续工作并接收通知,但它不会让我返回控制权,以便能够根据服务器的通知工作) 取消执行时,我可以通过控制台查看所有通知

有没有办法控制HttpResponseMessage,以便能够处理服务器发送给我的每个响应

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

这是我取消操作时通过控制台de
“wait 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;
}
公共异步静态任务GetRequest(字符串url) { HttpClient=新的HttpClient(); HttpResponseMessage response=新的HttpResponseMessage(); response=wait client.GetAsync(url,HttpCompletionOption.ResponseHeadersRead); 控制台写入线(“连接状态”); Console.WriteLine(响应状态码); response.EnsureSuccessStatusCode(); var body=await response.Content.ReadAsStringAsync().ConfigureAwait(continueOnCapturedContext:false); 控制台。写线(“回答”); 控制台。写入线(主体); Console.WriteLine(“\n”); Console.WriteLine(“\n注意!!已断开与持久性行的连接\n”); 控制台。写入线(“连接完成”); int result1=1; 返回结果1; } 根据,您不必为每个请求创建新的
HttpClient

HttpClient打算实例化一次并在整个过程中重复使用 应用程序的生命周期。实例化的
HttpClient
类 每一个请求都会耗尽重型设备下可用的插座数量 负载

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

然后,您使用
ResponseHeadersRead
选项,这意味着

一旦有响应,操作应尽快完成,并且 读取标题。内容尚未阅读


尝试切换到
ResponseContentRead
而不是当接收到每个部分时,您正在寻找解析部分HTTP响应。HTTP协议不知道/不理解您在一个HTTP响应中发送/接收由换行符分隔的多个离散消息

据我所知,
HttpClient
对您没有多大帮助,因为它被设计为接收一个完整的HTTP响应。里克·斯特拉尔(Rick Strahl)有一个关于这个主题的博客

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


TcpClient
可能不是此场景中的最佳方法,因为您可能还需要实现TLS(如果您的端点是HTTPS)。

您需要以某种方式暂停它,同时保持它完全打开,这完全是我需要的。我必须使用HttpWebRequest执行请求get,然后将答案保存在缓冲区中,并从另一个方法查阅该缓冲区并对其进行分析,我尝试这样做,并告诉他们如何进行。非常感谢您的回答。