[英]Downloading large file from asp.net core web api to winforms throws json value of length is large and not supported
[英]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();
您需要注意一些重要的細節,例如,確保:
有兩篇演練文檔和學習文章可以幫助您創建 SignalR 服務器和客戶端:
使用上面提到的鏈接,這是一個非常快速的分步示例,說明如何在 Windows Forms 應用程序中發送和接收 SignalR 消息。 在此示例中,聊天服務器應用程序是一個 ASP.NET Core Web 應用程序,客戶端應用程序是一個 Windows Forms 應用程序。
1 - 創建主機應用程序
創建一個 ASP.NET Core Web 應用程序,名稱為SignalRChat
。 (啟用HTTPS,使用.NET 6)
在項目中創建一個名為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); } } }
在 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 - 創建客戶端應用程序
創建一個名為SignalRChatClient
的新 WinForms 應用程序 (.NET 6)。
放下一個按鈕,名稱為connectButton
放下一個按鈕,名稱為sendButton
放置一個名為userTextBox
的文本框
放置一個名為messageTextBox
的文本框
刪除一個名為messagesList
的列表框
雙擊connectButton
將空事件處理程序添加到表單。 我們稍后會添加正文。
雙擊sendButton
將空事件處理程序添加到表單。 我們稍后會添加正文。
將 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); } } } }
重要提示:確保將 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並運行
現在您可以按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.