【问题标题】:SignalR .net core FiltersSignalR .net 核心过滤器
【发布时间】:2020-01-28 17:31:32
【问题描述】:

SignalR 是否具有与 here 描述的 MVC 过滤器类似的选项?

使用 MVC,我可以创建一个动作过滤器(从 IAsyncActionFilter 派生)并将其用作 MVC 方法的属性。

例如:

[ServiceFilter(typeof(MyCustomAsyncActionFilter))]
public async Task<IActionResult> GetAlbums() { }

通过上面的示例,然后可以实现 MyCustomAsyncActionFilter 来处理需要在执行方法之前执行的自定义代码。

在使用 SignalR 方法时,与上述等效的是什么?

【问题讨论】:

    标签: asp.net-core .net-core signalr


    【解决方案1】:

    据我所知,SignalR Core 中还没有像 ASP.NET SignalR 集线器管道这样的功能(请参阅GitHub issue),并且 MVC 过滤器不适用于 SignalR。

    一种解决方法可能是实现您自己的 HubDispatcher 并覆盖 DispatchMessageAsync 方法:

    public class CustomHubDispatcher<THub> : DefaultHubDispatcher<THub> where THub : Hub
    {
        public CustomHubDispatcher(
            IServiceScopeFactory serviceScopeFactory,
            IHubContext<THub> hubContext,
            IOptions<HubOptions<THub>> hubOptions,
            IOptions<HubOptions> globalHubOptions,
            ILogger<CustomHubDispatcher<THub>> logger) : base(serviceScopeFactory, hubContext, hubOptions, globalHubOptions, logger)
        {
        }
    
        public override Task DispatchMessageAsync(HubConnectionContext connection, HubMessage hubMessage)
        {
            switch (hubMessage)
            {
                case InvocationMessage invocationMessage:
                    {
                        // do something here
                        break;
                    }
            }
            return base.DispatchMessageAsync(connection, hubMessage);
        }
    }
    

    并在 ConfigureServices 中使用它:

    services.AddSignalR();
    services.AddSingleton(typeof(HubDispatcher<>), typeof(CustomHubDispatcher<>));
    

    【讨论】:

    • 谢谢,现在必须这样做,祝您有美好的一天!
    • 注意:HubDispatherDefaultHubDispatcher 现在是 internal v3。所以它们不能再以这种方式使用。目前似乎没有替代方案。显然在 V5 中将会有一个可以定制的“管道”
    【解决方案2】:

    .NET 5 支持Hub Filters

    来自文档:

    services.AddSignalR(options =>
    {
        // Global filters will run first
        options.AddFilter<CustomFilter>();
    }).AddHubOptions<ChatHub>(options =>
    {
        // Local filters will run second
        options.AddFilter<CustomFilter2>();
    });
    

    过滤器需要实现IHubFilter

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多