1. ホーム
  2. c#

[解決済み] コントローラからSignalR Core Hubのメソッドを呼び出す

2023-07-28 14:32:30

質問

ControllerからSignalR Core Hubのメソッドを呼び出すにはどうしたらよいですか?

ASP.NET Core 2.0 with Microsoft.AspNetCore.SignalR (1.0.0-alpha2-final)を使用しています。

私は、Excel、SolidEdge...と通信するWindowsサービスを持っています。操作が完了すると、ASP.NET Core アプリケーションの私のコントローラーに要求を投稿します。今、私は SignalR でサーバーに接続されているすべてのクライアントに、外部プログラムがあるタスクを完了したことを通知する必要があります。

ウィンドウサービスの動作は変更できません。(ウィンドウサービスからSignalRに接続することはできません)。

古いSignalRの解決策をたくさん見つけました( GlobalHost.ConnectionManager.GetHubContext ) のための多くの解決策を見つけましたが、多くの変更があり、それらの解決策はもう動作しません。

私のコントローラー

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

どのように解決するのですか?

解決方法1

もう一つの方法は、HubContextをコントローラにインジェクトすることです。

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

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

では、さらに

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

しかし、その場合、すべてのクライアントでメソッドを直接呼び出すことになります。

解決策2

型付きハブを使用することもできます。 サーバーがクライアントに対してどのメソッドを呼び出すことができるかを定義したインターフェースを作成するだけです。

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

Hubから継承。

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

入力されたhubcontextをコントローラに注入し、動作させます。

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