2017-10-24 1 views
4

Wie kann ich SignalR Core Hub-Methode von Controller aufrufen?
Ich verwende ASP.NET Core 2.0 mit Microsoft.AspNetCore.SignalR (1.0.0-alpha2-final).Call SignalR Core Hub-Methode vom Controller

Ich habe Windows-Dienst, die mit Excel, SolidEdge kommunizieren ... Wenn der Vorgang abgeschlossen ist, posten Anfrage an meinen Controller in ASP.NET Core-Anwendung. Jetzt muss ich alle mit dem Server verbundenen Clients mit SignalR informieren, dass das externe Programm eine Aufgabe erledigt hat.
Ich kann nicht ändern, wie Fensterdienst funktioniert. (Verbindung mit SignalR vom Fensterdienst nicht möglich).
Ich fand viel Lösung für alte SignalR (GlobalHost.ConnectionManager.GetHubContext), aber viel hat sich geändert und diese Lösungen funktionieren nicht mehr.

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

Meine Nabe:

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

Antwort

11

Lösung 1

Eine andere Möglichkeit ist Ihre HubContext in Ihrem Controller wie zu injizieren:

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

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

Dann können Sie auch

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

nennen Aber dann rufen Sie Methoden auf allen Clients lenken.

Lösung 2

Sie können auch mit typisierten Hubs arbeiten: Einfach eine Schnittstelle schaffen, in dem Sie auf den Clients, welche Methoden der Server definieren nennen:

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

vererben Hub:

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

Injizieren Sie den typisierten Hubkontext in Ihren Controller und arbeiten Sie damit:

[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" }; 
    } 
    } 
+1

Diese Antwort ist großartig. Danke, aber es beantwortet meine Frage nicht wirklich. Es wird es für jetzt tun. Aber früher oder später muss ich die Hub-Methode aufrufen. Keine Nachricht an alle Clients senden. – Makla

+0

@Makla: Ich habe die Antwort geändert siehe Link – Tester

+1

@Makla: Ich habe eine bessere Lösung gefunden. Siehe Lösung 2. Ich denke, das wird dir helfen. – Tester