【发布时间】:2017-10-12 14:10:52
【问题描述】:
我们有一个使用 .Net 向 SignalR 客户端发送文件的解决方案
我们现在已经迁移到 .Net Core
在之前的 .net 解决方案中,我们习惯于通过 GlobalHost.ConnectionManager 来 Hub 上下文
var myHub = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
myHub.Clients.Client(connectionId).doStuffWithFile(fileByteArray, fileName);
在客户端,函数doStuffWithFile 将由两个参数触发。
在 new .Net Core 解决方案中,我通过从 Hub 派生创建了一个 Hub 类。我添加了一种 Send 方法将文件发送到特定客户端,而不是将其广播给每个人
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 方法,但它根本不起作用。你能告诉我怎么做吗?
【问题讨论】:
标签: c# signalr .net-core asp.net-core-signalr