Как настроить глобализацию? - PullRequest
0 голосов
/ 12 марта 2020

Я застрял в ASP. NET проблеме глобализации веб-API. Я хочу получить дату и время в формате, указанном в формате c, при вызове веб-API. Пожалуйста, предоставьте некоторые идеи.

В моем решении, во-первых, есть один обработчик делегирования, задачей которого является задание культуры. Он определяется следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web;

namespace CultureHandling.Handlers
{
     public class CultureHandler : DelegatingHandler
     {
          protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, 
               CancellationToken cancellationToken)
          {
                  if (request != null && request.Headers != null && request.Headers.Count() > 0)
                  {
                        var reqHdrs = request.Headers.AcceptLanguage;
                        var headerValue = reqHdrs.OrderByDescending(e => e.Quality ?? 1.0D)
                                .Where(e => !e.Quality.HasValue || e.Quality.Value > 0.0D)
                                .First();


                       System.Threading.Thread.CurrentThread.CurrentUICulture = 
                       System.Globalization.CultureInfo.GetCultureInfo(headerValue.Value.ToString());
                       System.Threading.Thread.CurrentThread.CurrentCulture = 
                       System.Globalization.CultureInfo.GetCultureInfo(headerValue.Value.ToString());
                    }
                    return base.SendAsync(request, cancellationToken);
                 }
             }
        }
   }

Тогда у меня есть конвертер даты и времени, определенный как:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace CultureHandling.Converters
{
    public class CustomDateTimeConverter : DateTimeConverterBase
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            return (DateTime.Parse(reader.Value.ToString()));
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteValue(((DateTime)value).ToString());
        }
    }
}

Очень простой класс модели:

public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime Doj { get; set; }
    }

И соответствующее действие контроллера:

    public class EmployeeController : ApiController
    {
        private readonly List<Employee> employees = null;
        public EmployeeController()
        {
            employees = new List<Employee>();
            employees.Add(new Employee { Id = 1, Name = "Employee1", Doj = new DateTime(2014, 7, 1)});
            employees.Add(new Employee { Id = 2, Name = "Employee2", Doj = new DateTime(2015, 7, 1)});
        }

        public List<Employee> Get()
        {
            return employees;
        }
    }

Я настроил WebApiConfig.cs как:

config.MapHttpAttributeRoutes();
config.MessageHandlers.Add(new CultureHandler());
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new CustomDateTimeConverter());

Теперь проблемная часть: в идеале, если я вызываю API с помощью Accept Язык как en-US , должен возвращать значение даты и времени в формате MM / дд / гггг и для fr-FR формат дд / MM / YYYY . Но в обоих случаях я получаю значение в формате MM / dd / yyyy.

Согласно исследованию, я обнаружил, что CultureHandler работает должным образом, вот снимок экрана Почтальона:

enter image description here

Перерыв -point в CultureHandler.cs: enter image description here

Но, к удивлению, во время привязки модели я вижу, что культура будет изменена на en-US:

enter image description here

Я полагаю, что это причина того, что я не получаю значение даты и времени в формате дд / мм / гггг , когда культура - FR-FR:

enter image description here

Итак, мой вопрос: почему и где меняется эта культура? Я делаю какую-либо ошибку в кодировании? Заранее спасибо!

1 Ответ

0 голосов
/ 14 марта 2020

Я создаю новый пустой проект, затем я написал весь общий код в моем решении. Ваш код работает верно. Скриншоты ниже

en

fr

Я пробовал с почтальоном.

...