是否可以在信号中心中使用IAsyncActionFilter?

时间:2019-04-22 04:30:50

标签: c# asp.net-core signalr

使用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 :(得分:0)

您猜对了,SignalR与MVC使用的流水线不同。可以进行快速测试。

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

并注释掉

        //app.UseMvc();

您会发现signalR仍然有效。 中间件似乎对此也不起作用。