是否可以在信号器集线器中使用IAsyncActionFilter?

问题描述 投票:0回答:1

使用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相同的流水线技术,但是我错过了什么,或者这是不可能的?

c# asp.net-core signalr
1个回答
0
投票

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

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

并评论出来

        //app.UseMvc();

你会发现signalR仍然有效。中间件似乎也不适用于此。

© www.soinside.com 2019 - 2024. All rights reserved.