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 который затем создает ответ.

Так что было бы много кода, чтобы всегда устанавливать культуру прямо перед тем, как я ее использую.

Ответы на вопрос(3)

Ваш ответ на вопрос