繁体   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