使用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不在同一流水线上,但是我是否缺少某些东西,或者这是不可能的吗?
答案 0 :(得分:0)
您猜对了,SignalR与MVC使用的流水线不同。可以进行快速测试。
app.UseSignalR(routes =>
{
routes.MapHub<ChartHub>("/chart");
});
并注释掉
//app.UseMvc();
您会发现signalR仍然有效。 中间件似乎对此也不起作用。