C# 使用持久连接c处理HttpResponseMessage#
我正在使用Httpclient C#.net 连接到url 我需要提出一个GET请求。此连接是持久的。 问题是我需要根据服务器发送给我的通知执行操作 当执行C# 使用持久连接c处理HttpResponseMessage#,c#,dotnet-httpclient,C#,Dotnet Httpclient,我正在使用Httpclient C#.net 连接到url 我需要提出一个GET请求。此连接是持久的。 问题是我需要根据服务器发送给我的通知执行操作 当执行HttpResponseMessage时,它会挂起(由于是持久性的,它会持续工作并接收通知,但它不会让我返回控制权,以便能够根据服务器的通知工作) 取消执行时,我可以通过控制台查看所有通知 有没有办法控制HttpResponseMessage,以便能够处理服务器发送给我的每个响应 我应该为此使用另一种技术吗 这是我取消操作时通过控制台de“w
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,然后将答案保存在缓冲区中,并从另一个方法查阅该缓冲区并对其进行分析,我尝试这样做,并告诉他们如何进行。非常感谢您的回答。