[英]In ASP.NET Core SignalR, how do I send a message from the server to a client?
[英]how to send a binary file to SignalR client from server in dotnet core
我們有一個使用.Net將文件發送到SignalR客戶端的解決方案現在我們已移至.Net Core在以前的.net解決方案中,我們習慣於通過GlobalHost.ConnectionManager
來使用Hub上下文。
var myHub = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
myHub.Clients.Client(connectionId).doStuffWithFile(fileByteArray, fileName);
在客戶端的何處,函數doStuffWithFile
將使用兩個參數觸發。
在新的.Net Core解決方案中,我通過繼承Hub創建了Hub類。 我添加了一種發送方法,可以將文件發送到特定客戶端,而不是向每個客戶端廣播
public class MyHub : Hub
{
private static string _connectionId;
public override Task OnConnectedAsync()
{
_connectionId = Context.ConnectionId;
return Task.CompletedTask;
}
public override Task OnDisconnectedAsync(Exception exception)
{
_connectionId = Context.ConnectionId;
//// remove Connection Id
return base.OnDisconnectedAsync(exception);
}
public async Task Send(byte[] fileByteArray, string fileName)
{
await Clients.Client(_connectionId).InvokeAsync("doStuff", fileByteArray, fileName);
}
}
但是,我在.Net核心中沒有任何機制(例如GlobalHost或ConnectionManager)來獲取HubContext發送文件。
在客戶端:
static void Main(string[] args)
{
var connection = new HubConnectionBuilder()
.WithUrl("http://localhost:25786/file")
.WithConsoleLogger()
.Build();
connection.On<byte[], string>("doStuff", DoStuff);
connection.StartAsync().ContinueWith(
task =>
{
if (task.IsFaulted)
{
Console.WriteLine("Connection faulty");
}
});
Console.ReadLine();
}
private static void DoStuff(byte[] data, string name)
{
File.WriteAllBytes(@"c:\Projects\" + name, data);
}
我試圖創建一個MyHub的新實例來調用Send方法,但它根本無法正常工作。 您能告訴我該怎么做嗎?
這不是您問題的直接答案,但希望它將幫助您找到解決方案。
將連接ID存儲在靜態類變量中不正確。 每次連接新客戶端時,它都會更改,您將無法控制要發送到哪個客戶端。 根據您提供的代碼,您不清楚如何知道將文件發送到哪個客戶端。 請注意,當客戶端斷開連接時,還要設置_connectionId
,因此很有可能嘗試將數據發送到您知道已關閉的連接。 我實際上認為您將希望將目標連接ID或用戶傳遞給中心的Send
方法。 我認為您在集線器方法本身中可能沒有足夠的上下文來解析連接ID,但是由於連接ID是SignalR概念,因此可能很難在SignalR組件外部訪問它。 這就是為什么使用用戶而不是連接ID(即Clients.User(...)
而不是Clients.Client(...
))更容易的原因。
GlobalHost
不再在新的SignalR存在。 相反,您可以將IHubContext<THub>
注入IHubContext<THub>
中調用方法的類,並使用InvokeAsync
。 這是從Mvc Controller調用集線器方法的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.