Solution 1
Another possibility is to inject your HubContext into your controller like:
public VarDesignCommController(IHubContext<VarDesignHub> hubcontext)
{
HubContext = hubcontext;
...
}
private IHubContext<VarDesignHub> HubContext
{ get; set; }
Then you can also call
await this.HubContext.Clients.All.InvokeAsync("Completed", id);
But then you will direct call methods on all clients.
Solution 2
You can also work with typed hubs:
Simple create an interface where you define which methods your server can call on the clients:
public interface ITypedHubClient
{
Task BroadcastMessage(string name, string message);
}
Inherit from Hub:
public class ChatHub : Hub<ITypedHubClient>
{
public void Send(string name, string message)
{
Clients.All.BroadcastMessage(name, message);
}
}
Inject your the typed hubcontext into your controller, and work with it:
[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" };
}
}