我正在使用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;
}
答案 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)。