Я использую Newtonsoft.Json.JsonConverter и .NET Framework 4.7.2.
У меня есть контроллер, который возвращает объект со свойством типа LocalizedString, который представляет собой простой объект с 2 свойствами:английское и французское представление строки.
Контроллер устанавливает текущую нить в текущий поток следующим образом:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(this.Name);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(this.Name);
Культура исходит из файлов cookie запроса и при запросе в контроллереПОЛУЧИТЕ метод, это работает.
LocalizedString имеет метод ToString, который выглядит следующим образом:
public string ToString(string language)
{
return language.Equals(Language.English.CultureName, StringComparison.OrdinalIgnoreCase) ? this.English : this.French;
}
Теперь у меня есть JsonConverter для управления сериализацией объектов LocalizedString, который выглядит следующим образом:
public class LocalizedStringJsonConverter : JsonConverter
{
#region Methods
/// <summary>
/// Writes the JSON representation of the object.
/// </summary>
/// <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param><param name="value">The value.</param><param name="serializer">The calling serializer.</param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(((LocalizedString)value).ToString(Thread.CurrentThread.CurrentCulture.Name));
}
/// <summary>
/// Reads the JSON representation of the object.
/// </summary>
/// <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param><param name="objectType">Type of the object.</param><param name="existingValue">The existing value of object being read.</param><param name="serializer">The calling serializer.</param>
/// <returns>
/// The object value.
/// </returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
/// <summary>
/// Determines whether this instance can convert the specified object type.
/// </summary>
/// <param name="objectType">Type of the object.</param>
/// <returns>
/// <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
/// </returns>
public override bool CanConvert(Type objectType)
{
return objectType == typeof(LocalizedString);
}
#endregion
}
Когда я запрашиваю культуру в JsonConverter следующим образом: Thread.CurrentThread.CurrentCulture.Name
Значение всегда является культурой сервера (которая является французской, когда я отлаживаю на моем ПК).
Я пытаюсь понять, что я делаю неправильно ... Я знаю множество других способов сделать то, что я хочу сделать, например, я мог бы позволить клиенту управлять культурой с помощью javascript или мой контроллер мог бы на самом деле вернутьстрока предварительно локализована, но это означало бы, что мне нужно было бы провести рефакторинг всего веб-приложения ... которого я пытаюсь избежать.
Спасибо за ваше время
ОБНОВЛЕНИЕ
Я попытался добавить свой собственный фильтр, чтобы убедиться, что культура все еще установлена после того, как мой контроллер возвращается, но JsonConverter выполняется после метода OnActionExecutedу фильтра и культура все равно не так.Я не знаю, что называет JsonConverter, но, вероятно, именно там должна быть установлена культура ...