Я пытаюсь сделать запрос async/await
из моего пользовательского FilterAttribute
, показанного ниже. У меня проблема в том, что это MVC5
и нет асинхронного базового класса для атрибутов фильтра, о которых я знаю, поэтому мне приходится использовать Task
для достижения того же результата. Я знаю, что использование Task
может повлиять на производительность, но я могу придумать любой другой способ обойти это.
Метод, с которым я хочу сделать async/await
вызов, это _authService.IsUserSessionValid
Мне нужно сделать вызов асинхронного метода, который обращается к базе данных и возвращает значение. Я не могу этого сделать, поэтому я завернул вызов в Task
. Я понимаю, что OnActionExecuting
вызывается дважды, а filterContext.Result
не перенаправляет пользователя на действие "SignOut"
, как я думал. Как я могу это исправить ?
public class SingleSessionValidationFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var _authService = (IAuthService)DependencyResolver.Current.GetService(typeof(IAuthService));
var _formsAuthenticationHelper = (IFormsAuthenticationHelper)DependencyResolver.Current.GetService(typeof(IFormsAuthenticationHelper));
var currentUserId = _formsAuthenticationHelper.GetLoggedInUserId();
var currentCookieId = HttpContext.Current.Request.Cookies["CookieKey"]?.Value;
var task = Task.Run(
async () => _authService.IsUserSessionValid(new UserSessionValidityCheckerViewModel()
{
CookieId = currentCookieId,
UserId = currentUserId
}));
task.Wait();
if (task.Result.IsCompleted)
{
var value = task.Result.Result;
if (!value)
{
filterContext.Result = new System.Web.Mvc.RedirectToRouteResult(
new RouteValueDictionary
{
{"action", "SignOut"},
{"controller", "Account"}
});
}
}
}
IsUserSessionValid
действительно асинхронно или это только вы заворачиваете его вTask.Run
? Что за история стоит за этим? - person Wiktor Zychla   schedule 31.01.2020Task.Run();
нет ожидаемой задачи, поэтому она все равно будет выполняться синхронно. - person Jawad   schedule 31.01.2020IAuthService
? Какова подписьIsUserSessionValid
и каково определение его типа результата? - person Stephen Cleary   schedule 31.01.2020