使用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相同的流水线技术,但是我错过了什么,或者这是不可能的?
您猜对了,SignalR不使用与MVC相同的流水线操作。可以进行快速测试。
app.UseSignalR(routes =>
{
routes.MapHub<ChartHub>("/chart");
});
并评论出来
//app.UseMvc();
你会发现signalR仍然有效。中间件似乎也不适用于此。