跟踪HttpWebRequest和HttpWebResponse的进度

chi*_*apa 6 vb.net json httpresponse httprequest getjson

我正在使用发送HTTP请求的Sharefile API并获得各自的答案.它们是通过URL制作的,并始终使用相同的功能.这里是.

Private Function InvokeShareFileOperation(ByVal requestUrl As String) As JObject

    Dim request As HttpWebRequest = WebRequest.Create(requestUrl)
    Dim response As HttpWebResponse = request.GetResponse()

    Dim reader As StreamReader = New StreamReader(response.GetResponseStream())

    Dim json As String = reader.ReadToEnd()
    response.Close()
    Return JObject.Parse(json)

End Function
Run Code Online (Sandbox Code Playgroud)

由于某些操作有点长,我需要以某种方式跟踪他们正在进行的进度并且不知道如何进行.后来我打算使用这个进度并从中创建一个进度条.

(编辑)顺便说一句,这是占用大部分时间的第二个代码行(下面),即跟踪操作.

Dim response As HttpWebResponse = request.GetResponse()
Run Code Online (Sandbox Code Playgroud)

Gee*_*r68 5

编辑:我认为您无法在这里以任何准确的方式衡量进度,因为大部分操作似乎都依赖于处理请求的远程服务器。GetResponse() 处理设置 DNS、连接、发送和等待远程服务器,这一切都在您的手中。如果返回内容长度标头,则仅可测量读取响应流。就我个人而言,我最初将进度显示为 20%,当 GetResponse 返回时为 60%,然后如果您在下载前有内容长度,或者在您完成阅读响应流后一次性完成最后 40% 可以增量显示。

作为网络请求,您可以先找出内容长度,然后使用缓冲区而不是 ReadToEnd() 读取响应流。这允许您在下载响应时计算进度并触发通知。

Dim request As HttpWebRequest = WebRequest.Create(requestUrl)

Using response As HttpWebResponse = request.GetResponse()
  Dim contentLength As Long = response.ContentLength
  Dim bytesReceived As Long
  Dim bufferLength as Integer = 8192
  Dim buffer(bufferLength) As Char
  Dim sb As New StringBuilder

  Using reader As StreamReader = New StreamReader(response.GetResponseStream())
    Do
      Dim bufferedCount As Integer = reader.Read(buffer, 0, bufferLength)
      sb.Append(buffer, 0, bufferedCount)
      bytesReceived += bufferedCount
      Console.WriteLine(bytesReceived / contentLength * 100 & "%")
    Loop While bytesReceived < contentLength
  End Using

  Return JObject.Parse(sb.ToString)
End Using
Run Code Online (Sandbox Code Playgroud)

显然,您可以使用进度更新函数或调用 SignalR 集线器来替换 Console.WriteLine 以更新网页,并且您可以试验缓冲区大小以查看最适合您的方式。


小智 1

也许一个简单的秒表是一个开始的方法?

    Dim timer As System.Diagnostics.Stopwatch = New Stopwatch()

    Dim request As HttpWebRequest = WebRequest.Create(requestUrl)

    timer.Start()
    Dim response As HttpWebResponse = request.GetResponse()
    timer.Stop()

    Dim reader As StreamReader = New StreamReader(response.GetResponseStream())
    Dim json As String = reader.ReadToEnd()
    response.Close()

    Label1.Text = "Secs:" & timer.Elapsed.ToString()
Run Code Online (Sandbox Code Playgroud)