gpt4 book ai didi

json - 跟踪 HttpWebRequest 和 HttpWebResponse 的进度

转载 作者:行者123 更新时间:2023-12-04 14:01:05 28 4
gpt4 key购买 nike

我正在使用 Sharefile API 发送 HTTP 请求并获得各自的答案。它们是通过 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

由于某些操作有点长,我需要在它们进行时以某种方式跟踪它们的进度,但不知道如何去做。稍后我打算使用该进度并从中创建一个进度条。

(编辑)
顺便说一句,花费最多时间的是第二行代码行(下面),即要跟踪的操作。
Dim response As HttpWebResponse = request.GetResponse()

最佳答案

编辑:我认为您无法在这里以任何准确的方式衡量进度,因为大部分操作似乎都依赖于处理请求的远程服务器。 GetResponse() 处理设置 DNS、连接、发送和等待远程服务器,这一切都在您的手中。如果返回内容长度 header ,则仅可测量读取响应流。就我个人而言,我最初将进度显示为 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

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

关于json - 跟踪 HttpWebRequest 和 HttpWebResponse 的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20993350/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com