Asp.NetコアSignalR取得ハブ例えば、外部ハブからメッセージを送信します

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/u011127019/article/details/90812008

コントローラからのメッセージを送信するIHubContext取得動作

このように、簡単な共通

public class HomeController : Controller
{
    private readonly IHubContext<NotificationHub> _hubContext;

    public HomeController(IHubContext<NotificationHub> hubContext)
    {
        _hubContext = hubContext;
    }
}
public async Task<IActionResult> Index()
{
    await _hubContext.Clients.All.SendAsync("Notify", $"Home page loaded at: {DateTime.Now}");
    return View();
}

第二に、メッセージが操作取得IHubContextミドルウェアから送信されます

アクセスIHubContext次のように中間管を:

app.Use(async (context, next) =>
{
    var hubContext = context.RequestServices
                            .GetRequiredService<IHubContext<MyHub>>();
    //...
});

III / IHubContextは、タイマタスクから非HTTPリクエストから取得しました 

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor accessor)
{

    MvcContext.Accessor = accessor;
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseStaticFiles();
    app.UseMvc();

    //配置SignalR
    app.UseSignalR(routes => routes.MapHub<CountHub>("/count"));

    //启动定时任务
    Task.Run(() =>
    {
        while (true)
        {
            var hubContext = app.ApplicationServices
            .GetService<IHubContext<CountHub>>();
            hubContext.Clients.All.SendAsync("someFunc", new { random = "定时任务" });
            Thread.Sleep(1000);
        }
    });
}

第四に、本実施形態のコントローラと、リクエストコンテキストIHubContextインスタンスから取得します

    public class MvcContext
    {
        public static IHttpContextAccessor Accessor;
        public static HttpContext GetContext()
        {
            return Accessor.HttpContext;
        }
    }
    public class HubOperate
    {
        public IHubContext<CountHub> GetHubOne()
        {
            return MvcContext.GetContext()
                 .RequestServices
                 .GetRequiredService<IHubContext<CountHub>>();
        }
    }

テストコード:

    [Route("test1/{action}")]
    public class Test1Controller : Controller
    {
        public IActionResult One()
        {
            HubOperate _hub = new HubOperate();
            _hub.GetHubOne().Clients.All.SendAsync("someFunc", new { random = "efgh" });
            return Content("执行完成");
        }
    }

:グローバルコンテキストを取得する方法Asp.NetコアのHttpContextコンテキスト取得要求を

 

多く:

 SignalRを使用してAsp.Netコア2.0技術は - はじめに

 結合Asp.NetコアのWebSocket

SingalR自己ホスト型(自己ホスト)実施例2は、WPFクライアントとWebクライアント領域の四角形の同期を実現しました

おすすめ

転載: blog.csdn.net/u011127019/article/details/90812008