Async WebApi Thread.CurrentCulture
У меня есть хостингOwin состоялсяВеб-API Проект, предоставляющий некоторые основные методы REST для меня.
Я хочу иметь многоязычные сообщения об ошибках, поэтому я используюРесурс файлы иBaseController это устанавливаетThread.CurrentCulture а такжеThread.CurrentUICulture кAccept-Language заголовок запроса.
public override Task ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
{
if (controllerContext.Request.Headers.AcceptLanguage != null &&
controllerContext.Request.Headers.AcceptLanguage.Count > 0)
{
string language = controllerContext.Request.Headers.AcceptLanguage.First().Value;
var culture = CultureInfo.CreateSpecificCulture(language);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
base.ExecuteAsync(controllerContext, cancellationToken);
}
Это все работает хорошо, но проблема появляется, если я сделаю свойметоды контроллера асинхронные.
Когда я используюЖдите в методе, это может продолжаться в другом потоке, и поэтому мойCurrentCulture а такжеCurrentUICulture потеряны
Вот'Вот небольшой пример, который я использовал, чтобы найти эту проблему.
public async Task PostData(MyData data)
{
Thread currentThread = Thread.CurrentThread;
await SomeThing();
if (Thread.CurrentThread.CurrentCulture != currentThread.CurrentCulture)
Debugger.Break();
}
Я нет всегда ломаютсяDebugger.Break линия, но большую часть времени я делаю.
Вот'S пример, где я на самом деле использую мойФайл ресурсов.
public async Task PostMyData(MyData data)
{
//Before this if I'm in the correct thread and have the correct cultures
if (await this._myDataValidator.Validate(data) == false)
//However, I might be in another thread here, so I have the wrong cultures
throw new InvalidMyDataException();
}
public class InvalidMyDataException : Exception
{
public InvalidMyDataException()
//Here I access my resource file and want to get the error message depending on the current culture, which might be wrong
: base(ExceptionMessages.InvalidMyData)
{
}
}
Некоторая дополнительная информация: у меня есть целая куча подобных исключений, и все они попадают в обычайExceptionFilterAttribute который затем создает ответ.
Так что было бы много кода, чтобы всегда устанавливать культуру прямо перед тем, как я ее использую.