Asp.net core net核心过滤器

Asp.net core net核心过滤器,asp.net-core,.net-core,signalr,Asp.net Core,.net Core,Signalr,SignalR是否具有与所述MVC过滤器类似的选项 使用MVC,我可以创建一个动作过滤器(从IAsyncationFilter派生),并将其用作MVC方法的属性 例如: [ServiceFilter(typeof(MyCustomAsyncActionFilter))] public async Task<IActionResult> GetAlbums() { } [ServiceFilter(typeof(MyCustomAsyncActionFilter))] 公共异步任务G

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

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

例如:

[ServiceFilter(typeof(MyCustomAsyncActionFilter))]
public async Task<IActionResult> GetAlbums() { }
[ServiceFilter(typeof(MyCustomAsyncActionFilter))]
公共异步任务GetAlbums(){}
在上面的示例中,可以实现MyCustomAsyncActionFilter来处理在执行方法之前需要执行的自定义代码


使用SignalR方法时,上面的等效功能是什么?

AFAIK在SignalR Core中还没有类似ASP.NET SignalR hub管道的功能(参见此),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);
    }
}
公共类CustomHubDispatcher:DefaultHubDispatcher其中THub:Hub
{
公共海关调度员(
IServiceScopeFactory服务ScopeFactory,
IHubContext hubContext,
有两种选择,
IOptions全球HUB选项,
ILogger logger):基本(serviceScopeFactory、hubContext、hubOptions、globalHubOptions、logger)
{
}
公共覆盖任务DispatchMessageAsync(HubConnectionContext连接,HubMessage HubMessage)
{
开关(hubMessage)
{
案例调用消息调用消息:
{
//在这里做点什么
打破
}
}
返回base.DispatchMessageAsync(连接,hubMessage);
}
}
并在ConfigureServices中使用它:

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

AFAIK在SignalR Core中还没有类似ASP.NET SignalR hub管道的功能(请参见此),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);
    }
}
公共类CustomHubDispatcher:DefaultHubDispatcher其中THub:Hub
{
公共海关调度员(
IServiceScopeFactory服务ScopeFactory,
IHubContext hubContext,
有两种选择,
IOptions全球HUB选项,
ILogger logger):基本(serviceScopeFactory、hubContext、hubOptions、globalHubOptions、logger)
{
}
公共覆盖任务DispatchMessageAsync(HubConnectionContext连接,HubMessage HubMessage)
{
开关(hubMessage)
{
案例调用消息调用消息:
{
//在这里做点什么
打破
}
}
返回base.DispatchMessageAsync(连接,hubMessage);
}
}
并在ConfigureServices中使用它:

services.AddSignalR();
services.AddSingleton(typeof(HubDispatcher<>), typeof(CustomHubDispatcher<>));
services.AddSignalR();
AddSingleton(typeof(HubDispatcher),typeof(CustomHubDispatcher));
.NET 5支持

从文档中:

services.AddSignalR(options =>
{
    // Global filters will run first
    options.AddFilter<CustomFilter>();
}).AddHubOptions<ChatHub>(options =>
{
    // Local filters will run second
    options.AddFilter<CustomFilter2>();
});
services.addSignaler(选项=>
{
//全局筛选器将首先运行
options.AddFilter();
}).AddHubOptions(选项=>
{
//本地筛选器将第二次运行
options.AddFilter();
});
过滤器需要实现.NET 5支持

从文档中:

services.AddSignalR(options =>
{
    // Global filters will run first
    options.AddFilter<CustomFilter>();
}).AddHubOptions<ChatHub>(options =>
{
    // Local filters will run second
    options.AddFilter<CustomFilter2>();
});
services.addSignaler(选项=>
{
//全局筛选器将首先运行
options.AddFilter();
}).AddHubOptions(选项=>
{
//本地筛选器将第二次运行
options.AddFilter();
});

过滤器需要实施

谢谢,现在就必须这样做,祝您有美好的一天!注意:
HubDispather
DefaultHubDispatcher
现在是从v3开始的
internal
。因此,它们不能再以这种方式使用。目前似乎没有替代方案。显然,将有一个“管道”,可以定制,在V5的到来谢谢,这将不得不做现在,有一个伟大的一天!注意:
HubDispather
DefaultHubDispatcher
现在是从v3开始的
internal
。因此,它们不能再以这种方式使用。目前似乎没有替代方案。显然,V5中会有一个可定制的“管道”