Как решить необходимость использования метода ожидания при инициализации ApiController

Итак, у меня есть базовый контроллер, от которого наследуются все контроллеры, и он реализует ApiController, при инициализации переопределения у меня есть что-то вроде этого:

    protected override void Initialize(HttpControllerContext controllerContext)
    {
        var tenantId= requestUtils.GetFromHeader(controllerContext.Request);
        if (tenantId!= null)
            log4net.ThreadContext.Properties["tenantId"] = tenantId;
        else
            log4net.ThreadContext.Properties["tenantId"] = "default";
        await unitOfWork.SetTenantIdentifier(tenantIdentifier);
        base.Initialize(controllerContext);
    }

Мне нужно установить tenantId для единицы работы (поскольку у меня есть многопользовательское решение), и перед ним требуется ожидание (поскольку мне нужно что-то получить из БД), но я не могу Инициализировать асинхронную задачу, поэтому я пытаюсь найти обходной путь или около того.


person Ali_Nass    schedule 09.05.2018    source источник


Ответы (1)


 //await unitOfWork.SetTenantIdentifier(tenantIdentifier);
 unitOfWork.SetTenantIdentifier(tenantIdentifier).Wait();

Вы должны убедиться, что нет риска взаимоблокировки в Wait().

person bommelding    schedule 09.05.2018
comment
Почему бы не использовать .GetAwaiter().GetResult(), просто чтобы убедиться, что любые исключения, возникающие в результате вызова этого метода, не заключены в AggregateException? - person Yannick Meeus; 09.05.2018
comment
Согласен :), но рекомендация избегать GetResult() давно устарела. В кодовых базах, созданных Microsoft (не Roslyn), есть множество примеров, которые используют его только в контексте синхронизации. - person Yannick Meeus; 09.05.2018
comment
Я не получаю никаких результатов в обоих случаях, никаких сбоев (даже ошибок), но контроллеры тоже ничего не возвращают, я предполагаю, что запрос где-то застрял? - person Ali_Nass; 09.05.2018
comment
Я не обновляю базу данных, я просто настраиваю арендатора, чтобы он знал, на какую базу данных ориентироваться. (другой арендатор = другая строка подключения) - person Ali_Nass; 09.05.2018
comment
Я извлекаю ключ шифрования каждый раз, когда устанавливаю арендатора (каждый клиентский ключ сравнения), и для его получения мне нужно, чтобы он имел ожидание. - person Ali_Nass; 09.05.2018