[解決済み] コントローラから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" };
}
}
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] C#で同期メソッドから非同期メソッドを呼び出すには?
-
[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。