Можно ли использовать IAsyncActionFilter в концентраторе сигналов? - PullRequest
0 голосов
/ 22 апреля 2019

С помощью приложения MVC aspnetcore я могу создать IAsyncActionFilter для измерения времени выполнения (реализовано как атрибут). Я хотел бы сделать то же самое с контроллером-концентратором Signalr, но, похоже, он не работает.

    public class TimeFilter : Attribute, IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            await next();
            sw.Stop();
            string logStr = ($"##### {context.ActionDescriptor.DisplayName} - EXC: {sw.ElapsedMilliseconds}ms");
            System.Diagnostics.Debug.WriteLine(logStr);
        }
    }

Это работает (через MVC):

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [TimeFilter]
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }

Сбой (через Signalr, TimeFilter никогда не вызывался):


    public class SRHub : Hub
    {
        [TimeFilter]
        public async Task Calc(int x, int y)
        {
            await Clients.Client(Context.ConnectionId).SendAsync("CalcResp", x+y);
        }
    }

Я предполагаю, что SignalR не использует тот же конвейер, что и MVC, но я что-то упустил или это просто невозможно?

1 Ответ

0 голосов
/ 23 апреля 2019

Вы правильно догадались, SignalR не использует тот же конвейер, что и MVC. Быстрая проверка может быть сделано.

        app.UseSignalR(routes =>
        {
            routes.MapHub<ChartHub>("/chart");
        });

и комментарий

        //app.UseMvc();

Вы найдете, что сигнал R все еще работает. Промежуточные программы, похоже, тоже не работают для этого.

...