Локализация для асинхронных вызовов в ASP.NET WebApi

Hi- Я планирую обработать локализацию на стороне сервера для строк ошибок и т.д. на основе заголовка "Accept-Language", установив CurrentUICulture на основе этого заголовка, но, по-видимому, он не течет по асинхронным вызовам, ниже пример кода для иллюстрации проблемы, есть ли какой-либо способ по умолчанию для обработки локализации для асинхронных вызовов?

   public async Task<HttpResponseMessage> GetAsync()
    {            
        //set the current ui culture, to say "fr-FR", based on "Accept-Language" header
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("**fr-FR**");  

       var task = httpClient.PutAsync(endpoint, content)            

        //do some processing

        var res  = await task;

        var culture = Thread.CurrentThread.CurrentUICulture.Name; **//ITS NOT necessarily fr-FR**

        //do some more processing
        //and handle localizations etc.

        return res;
    }

Я ищу более чистый/бесшовный способ обработки локализации для случаев, когда существуют реальные операции async esp. для кода, следующего за ожидаемым вызовом

Изменить: заменил Task.Run() на httpClient.PutAsync для ясности

Ответ 1

Task.Run и Task.Factory.StartNew не имеют никакого контекста. Это ожидаемое поведение. Контекст сохраняется при использовании ключевого слова await. Итак, что вы можете сделать:

public static async Task<IEnumerable<string>> GetAsync()
{            
    //set the current ui culture, to say "fr-FR", based on "Accept-Language" header
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");

    //do some processing

    var s = await GetSomething();

    var culture = Thread.CurrentThread.CurrentUICulture.Name; //It ja-JP

    return new[] { s, s };
}

public static Task<string> GetSomething()
{
    var cuture = Thread.CurrentThread.CurrentUICulture.Name; // It fr-FR
    var tcs = new TaskCompletionSource<string>();
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ja-JP");
    tcs.SetResult("<something>");
    return tcs.Task;
}