ASP.NET WebForms - VB.NET and SignalR



这是我的Hub代码(非常简单(:

Imports System
Imports System.Web
Imports Microsoft.AspNet.SignalR
Imports Microsoft.AspNet.SignalR.Hubs
Imports Microsoft.AspNet.SignalR.Client
Imports Microsoft.AspNet.SignalR.Messaging
Imports System.Threading.Tasks

Namespace SignalRChat

Public Class ChatHub
Inherits Hub
Public Sub Send(userName As String, message As String)
Clients.All.broadcastMessage(userName, message)
End Sub
End Class
End Namespace
  • 这是我的Aspx页面代码:

    Imports System.Web.UI.WebControls
    Imports Microsoft.AspNet.SignalR.Client
    Imports System.Threading.Tasks
    Public Class WebForm9
    Inherits System.Web.UI.Page
    
    Public Shared hubConnection As HubConnection
    Public Shared chatHubProxy As IHubProxy
    Public Sub MyChat_init(sender As Object, e As EventArgs) Handles Me.Init
    If IsPostBack = False Then
    hubConnection = New HubConnection("https://localhost:44343/")
    hubConnection.TraceLevel = TraceLevels.All
    hubConnection.TraceWriter = Console.Out
    chatHubProxy = hubConnection.CreateHubProxy("ChatHub")
    hubConnection.Start().Wait()
    End If
    chatHubProxy.On(Of String, String)("broadcastMessage", Sub(ByVal userName As String, ByVal message As String)
    Dim li As ListItem = New ListItem
    li.Value = userName & " - " & message
    li.Text = userName & " - " & message
    ListBox1.Items.Add(li)
    End Sub)
    End Sub
    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    chatHubProxy.Invoke("Send", "Io", "Messaggio")
    End Sub
    End Class
    

我做了很多尝试,但总是没有结果。。。我添加了回发检查,因为我注意到我正在启动与集线器的连接,每次单击按钮都会重新启动。。。

顺便说一句,如果我在同一个项目中添加一个带有JScript代码的页面,我可以捕获在JScript码上发送的所有消息,但从html页面发送的消息都没有被aspx codeehind捕获。。。

这真的很奇怪,因为如果我去掉listbox.items.add方法;MsgBox";相反,它会启动并工作。。。但我没有找到任何方法来管理";消息";从我的codeehind,更新我页面上的控件。。。也许是连接错误?你们中有人使用过SignalR和带有VB.NET代码的WebForms吗?

如果这有帮助,我在VB.NET WinForms应用程序中有一个可工作的客户端代码(用于测试目的(。(我的集线器在C#中(:

Hub(net5.0中的ASP.NET Core-使用Gerald Versluis的教程创建:https://www.youtube.com/watch?v=pDr0Hx67guk):

using Microsoft.AspNetCore.SignalR;
using System;
using System.Threading.Tasks;
namespace SignalR.Hubs;
public class OneHub : Hub
{
public async Task SendMessage(Message message)
{
Console.WriteLine($"{message.SentDateTime} Sender : {message.SenderId} - {message.MessageText}");
await Clients.All.SendAsync("MessageReceived", message);
}
}

WinForms(net4.8(:

Imports Microsoft.AspNetCore.SignalR.Client
Imports SignalRWinForms.Client.Messaging.Models
Public Class Form1
Private connection As HubConnection
Sub New()
InitializeComponent()
connection = New HubConnectionBuilder().WithUrl("http://192.168.1.230:5296/chat").Build()
connection.On(Of Messages)("MessageReceived", Sub(Messages)
Invoke(Sub()
ReceiveMessage(Messages)
End Sub)
End Sub)
connection.StartAsync()
End Sub

Private Sub ReceiveMessage(msg As Messages)
chatMessages.Text &= $"{Environment.NewLine}{msg.MessageText}"
End Sub

Private Async Sub btnSendMessage_Click(sender As Object, e As EventArgs) Handles btnSendMessage.Click
Dim message = New Messages With {
.MessageText = txtMessage.Text,
.SenderId = 1111,
.ReceiverId = 2222,
.Token = "token",
.SentDateTime = DateTime.Now
}
Await connection.InvokeCoreAsync("SendMessage", args:={message})
txtMessage.Text = String.Empty
End Sub
End Class

Form1非常简单——chatMessages标签用于填充消息,txtMessage文本框用于编写消息,还有一个btnSendMessage按钮。

消息类(两个项目通用(

Public Class Messages
Public Property SenderId As Integer
Public Property ReceiverId As Integer
Public Property MessageText As String
Public Property Token As String
Public Property SentDateTime As DateTime
End Class

最新更新