SignalR回调在带有.NET 6 Winforms客户端的ASP.NET Core 6 Web API中似乎未激发

wfsdck30  于 2022-12-30  发布在  .NET
关注(0)|答案(1)|浏览(247)

我有一个SignalR集线器,消息从客户端到达,但回调似乎不工作。
服务器代码:

public class ChatHub : Hub<IChatClient>
{
    private readonly ILogger<ChatHub> _logger;

    public ChatHub(ILogger<ChatHub> logger)
    {
        _logger = logger;
    }

    public async Task SendMessage(ChatMessage message)
    {
        try
        {
            if (message != null && message.From > 0 && message.To > 0)
            {
               ....
            }

            await Clients.All.ReceiveMessage(message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, $"Error in SendMessage  {ex.Message}");
        }
    }
}

配置SignalR的客户端代码:

private void connectChat()
    {
        _signalRConnection = new HubConnectionBuilder()
           .WithUrl(Properties.Settings.Default.APIPath + "/hubs/chat").WithAutomaticReconnect()
           .Build();

         try
        {

            //Connect to the server
            _signalRConnection.StartAsync().ContinueWith(task =>
            {
                if (task.IsFaulted)
                {
                    this.Invoke(new Action(() => txtMessages.AppendText("There was an error opening the connection: " + task.Exception.GetBaseException().Message)));
                }
                else
                {
                    this.Invoke(new Action(() => txtMessages.AppendText("Connected")));
                }
            });

            _signalRConnection.On<string, ChatMessage>("ReceiveMessage", (name, message) =>
            {
                if (txtMessages.InvokeRequired)
                {
                    txtMessages.Invoke(new Action(() => txtMessages.AppendText($"{name} : {message?.MessageText}" + Environment.NewLine)));
                }
                else
                {
                    txtMessages.AppendText($"{name} : {message?.MessageText}" + Environment.NewLine);
                }
            });
        }
        catch (Exception)
        {
            throw;
        }
    }

发送消息的客户端代码

ChatMessage message = new ChatMessage();

message.MessageText = txtChatMessage.Text;
message.From = UserId.Value;
message.To = toStation;
message.MessageTime = DateTime.Now;

_signalRConnection.SendAsync("SendMessage", message).Wait();
0sgqnhkj

0sgqnhkj1#

有几个重要的细节,你需要注意他们,例如,确保:

  • 您正在使用正确的URL
  • 在尝试连接之前,服务器应用程序正在运行
  • 启动连接,并等待应用程序连接到集线器
  • 您的配置正确
  • 发送和接收使用了正确的回叫名称。

有两个演练文档和学习文章可以帮助您创建SignalR服务器和客户端:

ASP.NET核心SignarR服务器的Windows窗体SignarR客户端

使用上面提到的链接,下面是一个非常快速的分步示例,说明如何在Windows窗体应用程序中发送和接收SignalR消息。在此示例中,聊天服务器应用程序是一个ASP.NET核心Web应用程序,客户端应用程序是一个Windows窗体应用程序。

1.创建名为SignalRChat的ASP.NET核心Web应用程序。(启用HTTPS,并使用. NET 6)
1.在项目中创建一个名为Hubs的文件夹,并向其中添加一个新文件ChatHub.cs,其内容如下:

using Microsoft.AspNetCore.SignalR;

namespace SignalRChat.Hubs
{
    public class ChatHub : Hub
    {
        public async Task SendMessage(string user, string message)
        {
            await Clients.All.SendAsync("ReceiveMessage", user, message);
        }
    }
}

1.在Program.cs中添加SignalR配置,添加配置后的文件内容如下:

using SignalRChat.Hubs;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chatHub");

app.Run();

2-创建客户端应用程序

1.创建一个新的WinForms应用程序(. NET 6),名称为SignalRChatClient
1.放置名为connectButton的按钮
1.放置名为sendButton的按钮
1.拖放名为userTextBox的文本框
1.拖放名为messageTextBox的文本框
1.拖放名为messagesList的列表框
1.双击connectButton将空的事件处理程序添加到表单中。稍后我们将添加主体。
1.双击sendButton将空的事件处理程序添加到表单中。稍后我们将添加主体。
1.将Form1.cs内容替换为以下内容:使用微软公司的客户端;

namespace SignalRChatClient
{
    public partial class Form1 : Form
    {
        HubConnection connection;
        public Form1()
        {
            InitializeComponent();
            connection = new HubConnectionBuilder()
               .WithUrl("https://localhost:7142/ChatHub")
               .WithAutomaticReconnect()
               .Build();
        }

        private async void connectButton_Click(object sender, EventArgs e)
        {
            connection.On<string, string>("ReceiveMessage", (user, message) =>
            {
                this.Invoke((Delegate)(() =>
                {
                    var newMessage = $"{user}: {message}";
                    messagesList.Items.Add(newMessage);
                }));
            });

            try
            {
                await connection.StartAsync();
                messagesList.Items.Add("Connection started");
                connectButton.Enabled = false;
                sendButton.Enabled = true;
            }
            catch (Exception ex)
            {
                messagesList.Items.Add(ex.Message);
            }
        }

        private async void sendButton_Click(object sender, EventArgs e)
        {
            try
            {
                await connection.InvokeAsync("SendMessage",
                    userTextBox.Text, messageTextBox.Text);
            }
            catch (Exception ex)
            {
                messagesList.Items.Add(ex.Message);
            }
        }
    }
}

1.* * 重要提示!:**请确保将URL修改为适合您的环境的值。为此,您可以运行Web应用并在浏览器中查看URL,也可以打开launchSettings.json文件并查看基于配置文件的URL。我正在VS中进行调试,因此使用了此节点中的URL https://localhost:7142

"profiles": {
 "SignalRExample": {
   "commandName": "Project",
   "dotnetRunMessages": true,
   "launchBrowser": true,
   "applicationUrl": "https://localhost:7142;http://localhost:5142",
   "environmentVariables": {
     "ASPNETCORE_ENVIRONMENT": "Development"
   }
 },

3-设置多个启动和运行

1.右键单击解决方案并选择"属性
1.在启动项目中,选择多个启动项目,并为SignalRChat和SignalRChatClient选择启动,然后保存更改。
现在,您可以按F5键并运行该项目。等待Web浏览器打开并导航到Web应用。Windows窗体也将打开并显示Form1。
按连接按钮,然后在列表中看到"连接已启动"消息后,在文本框中键入用户名和消息,然后按发送,您将在列表中收到消息。
好了!

相关问题