这是我的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