我陷入了 ASP.NET Web API 全球化问题。当我调用 Web 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());
现在,问题部分:
理想情况下,如果我使用 Accept Language 调用 APIen-US,它应该返回日期时间值是月/日/年格式和用于fr-FR,格式为日/月/年。但是,对于这两种情况,我都以 MM/dd/yyyy 格式获取值。
根据调查,我发现 CultureHandler 能够按预期工作,这是 Postman 的屏幕截图:
The break-point in CultureHandler.cs:
但是,令人惊讶的是,在模型绑定期间,我看到文化被更改为 en-US:
我相信这就是我没有获得日期时间值的原因日/月/年当文化为 fr-FR 时的格式:
所以,我的问题是这种文化为什么以及在哪里发生改变?我在编码中犯了任何错误吗?提前致谢!