读取HTTP响应

时间:2018-02-01 12:35:28

标签: c# asp.net http httpclient

客户端有一个页面,当被调用时会启动一个长时间运行的进程并间歇性地向其发送进程

格式为

[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();

似乎阻止并等待响应完成后再返回任何内容..

我需要能够在流入时读取流。这可能吗?

1 个答案:

答案 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.
            }
        }