Локализация для асинхронных вызовов в 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;
}