c# - 从 Controller 调用 SignalR Core Hub 方法

标签 c# signalr asp.net-core-2.0 asp.net-core-signalr

如何从 Controller 调用 SignalR Core Hub 方法?
我正在使用 ASP.NET Core 2.0 和 Microsoft.AspNetCore.SignalR (1.0.0-alpha2-final)。

我有与 Excel、SolidEdge 通信的 Windows 服务……操作完成后,它会向我在 ASP.NET Core 应用程序中的 Controller 发出请求。现在我需要通知所有使用 SignalR 连接到服务器的客户端外部程序完成了一些任务。
我无法改变窗口服务的工作方式。 (无法从窗口服务连接到 SignalR)。
我为旧的 SignalR (GlobalHost.ConnectionManager.GetHubContext) 找到了很多解决方案,但很多已经发生了变化,这些解决方案不再有效。

我的 Controller :

[Route("API/vardesigncomm")]
public class VarDesignCommController : Controller
{
    [HttpPut("ProcessVarDesignCommResponse/{id}")]
    public async Task<IActionResult> ProcessVarDesignCommResponse(int id)
    {
        //call method TaskCompleted in Hub !!!! How?

        return new JsonResult(true);
    }
}

我的中心:

public class VarDesignHub : Hub
{
    public async Task TaskCompleted(int id)
    {
        await Clients.All.InvokeAsync("Completed", id);
    }
}

最佳答案

解决方案一

另一种可能性是将 HubContext 注入(inject)到 Controller 中,例如:

public VarDesignCommController(IHubContext<VarDesignHub> hubcontext)
{
    HubContext = hubcontext;
    ...
}

private IHubContext<VarDesignHub> HubContext
{ get; set; }

那你也可以调用

await this.HubContext.Clients.All.InvokeAsync("Completed", id);

但随后您将在所有客户端上直接调用方法。

方案二

您还可以使用类型化的集线器: 简单地创建一个接口(interface),您可以在其中定义服务器可以在客户端上调用哪些方法:

public interface ITypedHubClient
{
    Task BroadcastMessage(string name, string message);
}

从集线器继承:

public class ChatHub : Hub<ITypedHubClient>
{
    public void Send(string name, string message)
    {
        Clients.All.BroadcastMessage(name, message);
    }
}

将类型化的 hubcontext 注入(inject) Controller ,并使用它:

[Route("api/demo")]
public class DemoController : Controller
{
    IHubContext<ChatHub, ITypedHubClient> _chatHubContext;
    public DemoController(IHubContext<ChatHub, ITypedHubClient> chatHubContext)
    {
        _chatHubContext = chatHubContext;
    }

    // GET: api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        _chatHubContext.Clients.All.BroadcastMessage("test", "test");
        return new string[] { "value1", "value2" };
    }
}

关于c# - 从 Controller 调用 SignalR Core Hub 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46904678/

相关文章:

asp.net-mvc - Autofac (+MVC + EF + SignalR + Hangfire) 生命周期范围

c# - 具有相同名称的多个单选按钮需要架构

c# - 身份服务器 4 在生产中注销时返回 404 错误是否有原因

c# - IWebHost : Calling Run() vs RunAsync()

c# - 使用 Mono 针对 .NET Framework 4.0 进行定位和编译

c# - 将 LDAP 中的 WhenChanged 属性(通用时间)转换为 C# 中的 DateTime

c# - 如何分析字符串

c# - SignalR(v2.2.0) Client.Group() 不适用于 IOS 客户端

c# - SignalR 在升级时导致重大问题

c# - C# 类库的开发/运行时许可机制?