public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { if (!(context.ActionArguments.Values.FirstOrDefault(x => x is Update) is Update update)) { context.Result = new StatusCodeResult(401); return; } var extendedUpdate = userContextProvider.Set(update); var id = extendedUpdate.Type == UpdateType.CallbackQuery ? extendedUpdate.CallbackQuery.From.Id : extendedUpdate.RealMessage.From.Id; telegramUserIdProvider.Set(id); var dbUser = await loaderProvider .Get <int, TelegramUser>() .GetOrLoadAsync(id); userContextProvider.SetDatabaseUser(dbUser); var result = await next(); if (result.Exception != null) { await telegramUsersNotifier .SendAsync((client, user) => client .SendTextMessageAsync(user.Id, result.Exception.ToString()), TelegramUserStates.Dev); result.ExceptionHandled = true; result.HttpContext.Response.StatusCode = 200; } }