93 votes

Appeler la méthode SignalR Core Hub depuis le contrôleur

Comment puis-je appeler la méthode SignalR Core Hub à partir du contrôleur ?
J'utilise ASP.NET Core 2.0 avec Microsoft.AspNetCore.SignalR (1.0.0-alpha2-final).

J'ai un service Windows qui communique avec Excel, SolidEdge ... Lorsque l'opération est terminée, il envoie une requête à mon contrôleur dans l'application ASP.NET Core. J'ai maintenant besoin d'informer tous les clients connectés au serveur avec SignalR que le programme externe a terminé une tâche.
Je ne peux pas changer la façon dont le service des fenêtres fonctionne. (Impossible de se connecter à SignalR depuis le service fenêtre).
J'ai trouvé une solution complète pour l'ancien SignalR ( GlobalHost.ConnectionManager.GetHubContext ), mais beaucoup de choses ont changé et ces solutions ne fonctionnent plus.

Mon contrôleur :

[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);
    }
}

Mon hub :

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

2voto

J'ai utilisé cette approche pour mon application auto-hébergée OWIN car je n'ai pas mis en place l'injection de dépendances.

Cela peut être laid mais les clients appelleront les constructeurs du Hub lorsqu'ils démarreront.

public class HostHub : Hub
{
    public static HostHub Instance { get; private set; }

    public HostHub()
    {
        Instance = this;
    }

    public void BroadcastMessage(string message)
    {
        Clients.All.NewMessage(message);
    }
}

0voto

Solution possible.

Le contrôleur

[Route("API/vardesigncomm")]
public class VarDesignCommController : Controller
{
    private IHubContext<ChatHub> _hubContext;
    public VarDesignCommController (IHubContext<ChatHub> hubContext){
       _hubContext=hubContext
    }

    [HttpPut("ProcessVarDesignCommResponse/{id}")]
    public async Task<IActionResult> ProcessVarDesignCommResponse(int id)
    {
       //call method TaskCompleted in Hub !!!! How?
       await ChatHub.TaskCompleted(_hubContext,id);
       return new JsonResult(true);
    }
}

Créer une méthode statique dans HubClass qui reçoit le contexte du hub.

public class ChatHub : Hub<ITypedHubClient>
{
    public static async Task TaskCompleted(IHubContext<ChatHub> hubContext,int id)
    {
       await hubContext.Clients.All.InvokeAsync("Completed", id);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X