SignalR .net核心滤波器

时间:2019-09-28 22:01:01

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

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

借助MVC,我可以创建一个动作过滤器(源自IAsyncActionFilter)并将其用作MVC方法上的属性。

例如:

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

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

与SignalR方法一起使用时,上述等效项是什么?

2 个答案:

答案 0 :(得分:2)

AFAIK在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<>));

答案 1 :(得分:1)

.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