簡體   English   中英

如何從dotnet核心中的服務器將二進制文件發送到SignalR客戶端

[英]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.

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