簡體   English   中英

SignalR 回調似乎沒有在 ASP.NET Core 6 Web API 和 .NET 6 Winforms 客戶端中觸發

[英]SignalR callback seems not firing in ASP.NET Core 6 Web API with .NET 6 Winforms client

我有一個 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();

您需要注意一些重要的細節,例如,確保:

  • 你用對了 URL
  • 在您嘗試連接之前,服務器應用程序正在運行
  • 開始連接,等待應用程序連接到集線器
  • 你有正確的配置
  • 您正在使用正確的回調名稱進行發送和接收。

有兩篇演練文檔和學習文章可以幫助您創建 SignalR 服務器和客戶端:

Windows Forms ASP.NET 核心 SignarlR 服務器的 SignarR 客戶端

使用上面提到的鏈接,這是一個非常快速的分步示例,說明如何在 Windows Forms 應用程序中發送和接收 SignalR 消息。 在此示例中,聊天服務器應用程序是一個 ASP.NET Core Web 應用程序,客戶端應用程序是一個 Windows Forms 應用程序。

1 - 創建主機應用程序

  1. 創建一個 ASP.NET Core Web 應用程序,名稱為SignalRChat (啟用HTTPS,使用.NET 6)

  2. 在項目中創建一個名為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); } } }
  3. 在 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. 創建一個名為SignalRChatClient的新 WinForms 應用程序 (.NET 6)。

  2. 放下一個按鈕,名稱為connectButton

  3. 放下一個按鈕,名稱為sendButton

  4. 放置一個名為userTextBox的文本框

  5. 放置一個名為messageTextBox的文本框

  6. 刪除一個名為messagesList的列表框

  7. 雙擊connectButton將空事件處理程序添加到表單。 我們稍后會添加正文。

  8. 雙擊sendButton將空事件處理程序添加到表單。 我們稍后會添加正文。

  9. 將 Form1.cs 內容替換為以下內容:using Microsoft.AspNetCore.SignalR.Client;

     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); } } } }
  10. 重要提示:確保將 URL 修改為適合您環境的值。 為此,您可以運行 web 應用程序並在瀏覽器中查看 URL,或者您可以打開 launchSettings.json 文件並根據配置文件查看 URL。 我在 VS 中調試,所以我從這個節點使用了 URL https://localhost:7142

     "profiles": { "SignalRExample": { "commandName": "Project", "do.netRunMessages": true, "launchBrowser": true, "applicationUrl": "https://localhost:7142;http://localhost:5142", "environmentVariables": { "AS.NETCORE_ENVIRONMENT": "Development" } },

3 - 設置多個Strartup並運行

  1. 右鍵單擊解決方案並選擇屬性
  2. 在啟動項目中,選擇 Multiple Startup Projects 並為 SignalRChat 和 SignalRChatClient 選擇 Start,然后保存更改。

現在您可以按F5並運行該項目。 等到 web 瀏覽器打開並導航到 web 應用程序。 Windows Form 也將打開並顯示 Form1。

按“連接”按鈕,然后在列表中看到“連接開始”消息后,在文本框中鍵入用戶名和消息,然后按“發送”,您將在列表中收到消息。

給你!

我認為這是因為您的客戶端方法ReceiveMessage有一個參數:

await Clients.All.ReceiveMessage(message);

在綁定事件處理程序時,您綁定了兩個參數:

_signalRConnection.On<string, ChatMessage>("ReceiveMessage", (name, message) =>

更正此以綁定正確數量的參數。

_signalRConnection.On<ChatMessage>("ReceiveMessage", (message) =>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM