С помощью приложения 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, но я что-то упустил или это просто невозможно?