2017-04-21 33 views
1

所以,当我访问我的网页,我使用这个设置视频模式:SignalR JS命令不上的WebSockets第一次执行(vb.net)

$("#pushStreamButton").click(function() { 
    if (initialized) { 
     var channelSelected = $("#channelSelect").val(); 
     var gameNameEntered = $("#gameName").val(); 
     var channelNameEntered = $("#channelName").val(); 
     if (gameNameEntered.length < 1) return; 
     $("#goLiveWindow").dialog("close"); 
     serverHub.server.setVideoMode(channelSelected, gameNameEntered, "", channelNameEntered); 
    } 
}); 

,这是在后端

Public Sub setVideoMode(ByVal mode As String, ByVal details As String, ByVal socialMessage As String, ByVal channel As String) 
    Dim user As FrontPageUser = Connections.matchFirst(Connections.frontPageUsers, Context.ConnectionId) 
    If user Is Nothing Then Return 
    If mode = "youtube" Then 
     Try 
      My.Computer.FileSystem.DeleteFile(HttpContext.Current.Server.MapPath("/images/streamavatar.gif")) 
     Catch Ex As Exception 
      Console.Write(Ex) 
     End Try 
    End If 

此功能如预期,但它确实是工作,但是我有一个按钮,恢复通道返回到默认的YouTube

$("#stopStreamButton").click(function() { 

     serverHub.server.setVideoMode("youtube", "", "", ""); 

}); 

使用第一个按钮更改频道后,单击第二个按钮不会执行任何操作,它似乎甚至不会尝试执行该命令,这是奇怪的。但是,如果我重新加载页面,按钮功能正常,通道恢复。

仅当使用websockets作为传输时,使用SSE/longpolling/foreverframe时,此问题也不存在。我正在用websockets操作相对陌生的水域,并且我已经尝试调试javascript和后端代码 - javascript看起来没有正确执行,但它不会喷出任何错误,并且它永远不会到达后端。

如果有人知道为什么发生这种情况,并可以解释我哪里出错了,它将不胜感激。

附加说明:在进一步挖掘之后,它实际上似乎停止了来自java端的所有功能,过了一段时间它似乎断开连接并强制刷新,不知道是什么导致了它,但我知道它必须与WebSockets的。

编辑 -

在调试原因,它似乎被链接到其他功能,发送推送通知到用户,当我关闭此功能,它的工作原理没有挂和阻塞的命令,但是当这种函数初始化它挂起,功能已经完成

Shared Function sendPushFox(username, pushDetails) As String 
    Dim avatar = Utils.getAvatarPath(username) 
    If avatar.Contains("/forum/download/file.php?avatar=") OrElse avatar.Contains("/images/solaire.png") Then 
     Try 
      My.Computer.Network.DownloadFile("https://foo.com" & avatar, HttpContext.Current.Server.MapPath("/images/streamavatar.gif")) 
     Catch ex As Exception 
      ChatProcessor.postNewMessage(Nothing, Nothing, ChatMessage.MessageType.Channel_Mod, "Problem downloading streamer avatar." & ex.ToString) 
     End Try 
    Else 
     Try 
      My.Computer.Network.DownloadFile(avatar, HttpContext.Current.Server.MapPath("/images/streamavatar.gif")) 
     Catch ex As Exception 
      ChatProcessor.postNewMessage(Nothing, Nothing, ChatMessage.MessageType.Channel_Mod, "Problem downloading streamer avatar." & ex.ToString) 
     End Try 
    End If 
    Dim query As String = "SELECT subscribeid FROM custom_user_data WHERE NOT subscribeid = ' ';" 
    Dim connection As New MySqlConnection(Utils.connectionString) : connection.Open() 
    Dim command As MySqlCommand = New MySqlCommand(query, connection) 
    Dim reader As MySqlDataReader = command.ExecuteReader() 
    Dim regList As New List(Of String) 
    Do While reader.Read 
     regList.Add(reader.GetString(0)) 
     ' IO.File.AppendAllText(Utils.serverPath & "errorlog.txt", reg1) 
    Loop 
    connection.Close() 
    Dim query2 As String = "SELECT p256dh FROM custom_user_data WHERE NOT p256dh = ' ';" 
    Dim connection2 As New MySqlConnection(Utils.connectionString) : connection2.Open() 
    Dim command2 As MySqlCommand = New MySqlCommand(query2, connection2) 
    Dim reader2 As MySqlDataReader = command2.ExecuteReader() 
    Dim regList2 As New List(Of String) 
    Do While reader2.Read 
     regList2.Add(reader2.GetString(0)) 
     ' IO.File.AppendAllText(Utils.serverPath & "errorlog.txt", reg1) 
    Loop 
    connection2.Close() 
    Dim query3 As String = "SELECT authsecret FROM custom_user_data WHERE NOT authsecret = ' ';" 
    Dim connection3 As New MySqlConnection(Utils.connectionString) : connection3.Open() 
    Dim command3 As MySqlCommand = New MySqlCommand(query3, connection3) 
    Dim reader3 As MySqlDataReader = command3.ExecuteReader() 
    Dim regList3 As New List(Of String) 
    Do While reader3.Read 
     regList3.Add(reader3.GetString(0)) 
     ' IO.File.AppendAllText(Utils.serverPath & "errorlog.txt", reg1) 
    Loop 
    connection3.Close() 
    Dim reg1 = regList.ToArray 
    Dim reg2 = regList2.ToArray 
    Dim reg3 = regList3.ToArray 
    Dim payload = "{ ""title"": ""foo bar"",  ""body"": """ & username.name.ToString & " playing " & pushDetails.ToString & """, ""icon"" : ""https://foo.com/images/streamavatar.gif"" }" 
    For i As Integer = 0 To reg1.Length - 1 
     Dim webPushClient = New WebPushClient() 

     Dim subject = "https://foo.com" 
     Dim vapidKeys As VapidDetails = VapidHelper.GenerateVapidKeys() 
     Dim vapidDetails = New VapidDetails(subject, vapidKeys.PublicKey, vapidKeys.PrivateKey) 
     Try 
      Console.WriteLine("Public {0}", vapidKeys.PublicKey) 
      Console.WriteLine("Private {0}", vapidKeys.PrivateKey) 
      Dim subscription = New PushSubscription(reg1(i), reg2(i), reg3(i)) 

      webPushClient.SetGCMAPIKey("key here") 
      webPushClient.SendNotification(subscription, payload, vapidDetails) 

     Catch Ex As Exception 
      Console.Write(Ex) 
     End Try 
    Next 
    Return Nothing 
End Function 

所以看似之后,它的使用WebSockets的冲突,因为它的功能上longpolling和等,但我仍然不知道为什么,它不仅影响谁调用该函数的用户。

奇怪的是,这似乎之后,这里发生

 For i As Integer = 0 To reg1.Length - 1 
      webPushClient.SetGCMAPIKey("key here") 
      webPushClient.SendNotification(subscription, payload, vapidDetails) 
     Next 

它的功能完全没问题的“下一步”挂,但一旦它到达的为末,它只是从来没有持续下去,它几乎一无所有之后接下来,没有错误,没有任何反应,设置休息和结果如预期,我只是困惑,为什么它不会继续下去,只有使用websockets trasports,longpolling等是好的

回答

0

我其实已经想通了,事实证明,websocket不喜欢由命令

制作的非异步通信
webPushClient.SendNotification(subscription, payload, vapidDetails) 

幸运的是webPush lib中有一个异步和其更改为

webPushClient.SendNotificationAsync(subscription, payload, vapidDetails) 

固定的一切。