客户端有一个页面,当被调用时会启动一个长时间运行的进程并间歇性地向其发送进程
格式为
[dd/MM/yyyy hh:mm:ss] - Process Started
[dd/MM/yyyy hh:mm:ss] - CSV Imported
[dd/MM/yyyy hh:mm:ss] - Process 10% complete
然后30秒后它可能会写出:
[dd/MM/yyyy hh:mm:ss] - User x Created
[dd/MM/yyyy hh:mm:ss] - User y Created
[dd/MM/yyyy hh:mm:ss] - Process 20% complete
等...运行需要10-20分钟,我们无法访问此页面的代码。
我被要求做的是从其他应用程序之一调用此页面,使用输出并在我们的仪表板上进行实时更新。
我的第一个想法是使用http客户端调用.GetStreamAsync()并且循环读取流并循环报告最后写出的内容。
这是我的第一次尝试:
using (HttpClient httpClient = new HttpClient())
{
httpClient.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
var requestUri = "http://localhost:64501/Page1.aspx";
var stream = httpClient.GetStreamAsync(requestUri).Result;
using (var reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
var currentLine = reader.ReadLine();
Thread.Sleep(1000);
}
}
}
然而 var currentLine = reader.ReadLine();
似乎阻止并等待响应完成后再返回任何内容..
我需要能够在流入时读取流。这可能吗?
答案 0 :(得分:1)
问题在于ReadLine
,服务器可能没有发送行(逻辑似乎准备发送到忽略换行的网页),所以你需要读取数据块和将它们转换为字符串:
using (HttpClient httpClient = new HttpClient())
{
httpClient.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
var requestUri = "http://localhost:64501/Page1.aspx";
var stream = httpClient.GetStreamAsync(requestUri).Result;
string read = "";
byte[] buffer = new byte[1024];
while(!stream.EndOfStream)
{
int readed = stream.Read(buffer, 0, 1024);
read += Encoding.UTF8.GetString(buffer, 0, readed);
//Do whatever you need to do with the string.
}
}