流没有结束

Stream does not end

我尝试使用以下代码编写一个使用 Server-Sent-Event 的客户端:

Public Shared Function OpenSSEStream(ByVal url As String, ByVal _token As String, ByVal _identifier As String, ByVal _environment As String) As Stream
    Dim request = WebRequest.Create(New Uri(url))
    CType(request, HttpWebRequest).AllowReadStreamBuffering = False
    request.Headers.Add("Authorization:Bearer " + _token)
    request.Headers.Add("environment:" + _environment)
    request.Credentials = New NetworkCredential("id", _identifier)
    Dim response = request.GetResponse()
    Dim stream = response.GetResponseStream()
    SSEApplication.ReadStreamForever(stream)
    Return stream
End Function

Public Shared Sub ReadStreamForever(ByVal stream As Stream)
    Dim encoder = New UTF8Encoding()
    Dim buffer = New Byte(2047) {}

    While True
        If stream.CanRead Then
            Dim len As Integer = stream.Read(buffer, 0, 2048)
            If len > 0 Then
                Dim text = encoder.GetString(buffer, 0, len)
            End If
        End If
    End While
End Sub

这非常有效,因为我可以在文本变量中看到来自服务器(在调试模式下)的文本。不幸的是,如果我 运行 我进入中断模式的代码(不是调试)。我可以在调试模式下看到文本文件中填充了大约 2000 个数据集,看起来流没有结束并且 运行s 进入了一个无限循环左右?有人能帮我一下吗?

你需要退出循环,现在没有任何东西告诉它退出。

While True
    If stream.CanRead Then
        Dim len As Integer = stream.Read(buffer, 0, 2048)
        If len > 0 Then
            Dim text = encoder.GetString(buffer, 0, len)
        Else
            Exit While
        End If
    Else
        Exit While
    End If
End While

此外,流只能接收片段的信息。您应该连接数据。

Dim text As String = ""

While True
    If stream.CanRead Then
        Dim len As Integer = stream.Read(buffer, 0, 2048)
        If len > 0 Then
            text &= encoder.GetString(buffer, 0, len)
        Else
            Exit While
        End If
    Else
        Exit While
    End If
End While

这都可以重构

Dim streamData As New StringBuilder

While stream.CanRead
    Dim len As Integer = stream.Read(buffer, 0, 2048)

    If len > 0 Then
        ' There is the possibility that a Unicode character be split
        streamData.Append(encoder.GetString(buffer, 0, len))
    Else
         Exit While
    End If
End While