[FromBody]/ JSON binding doesn't use Culture from RequestCultureProviders
See original GitHub issueDescribe the bug
Culture derived from RequestCultureProviders is not being implemented in JSON Input binding.
The culture received is being used in query string, application/x-www-form-urlencoded binding but not working with application/json.
To Reproduce
https://github.com/ruchanb/AspNetCoreCultureModelBind This is standard new project build with addition of
var supportedCultures = new System.Collections.Generic.List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("es-MX")
};
var requestLocalizationOptions = new RequestLocalizationOptions
{
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures,
};
//requestLocalizationOptions.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
requestLocalizationOptions.RequestCultureProviders.Insert(0, new JsonRequestCultureProvider());
app.UseRequestLocalization(requestLocalizationOptions);
provider
public class JsonRequestCultureProvider : RequestCultureProvider
{
public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException(nameof(httpContext));
}
var header = httpContext.Request.Headers["culture"];
var culture = header.Count == 0 ? "en-US" : header[0]; // Use the value defined in config files or the default value
var uiCulture = culture;
return Task.FromResult(new ProviderCultureResult(culture, uiCulture));
}
}
Controller
[Route("api/[controller]/[action]")]
public class ValuesController : ControllerBase
{
[HttpGet]
public IActionResult Date1(DateTime date)
{
return Ok(date);
}
[HttpPost]
public IActionResult Date2(DateModel model)
{
return Ok(model);
}
[HttpPost]
public IActionResult Date3([FromBody]DateModel model)
{
return Ok(model);
}
}
public class DateModel
{
public DateTime Date { get; set; }
}
Here are some cURL commands to run when we start the application
curl http://localhost:20991/api/values/date1?date=5/15/2019
curl http://localhost:20991/api/values/date1?date=15/5/2019 -H "culture: es-MX"
curl http://localhost:20991/api/values/date2 -X POST -d "Date=5/15/2019"
curl http://localhost:20991/api/values/date2 -X POST -d "Date=15/5/2019" -H "culture: es-MX"
curl http://localhost:20991/api/values/date3 -X POST -d "{\"Date\":\"5\/15\/2019\"}" -H "Content-Type: application/json"
curl http://localhost:20991/api/values/date3 -X POST -d "{\"Date\":\"15\/5\/2019\"}" -H "culture: es-MX" -H "Content-Type: application/json"
Expected behavior
The expected behavior is to return date in ISO format, with 5 as Month, 15 as Day and 2019 as Year.
All the commands pass except the last one with application/json content-type and es-MX as culture. Here it takes the input as invalid.
Additional context
I am running the project on asp.net core 2.2 visual studio 2017. Issue is replicated also on 2.1 and 1.1 versions as I have checked.
I am aware this could, not be a bug, if so please provide information on how can I implement this behavior. Related SO question: https://stackoverflow.com/questions/55951070/datetime-input-to-deserialize-from-users-culture-instead-of-servers-asp-net-c
Issue Analytics
- State:
- Created 4 years ago
- Comments:12 (10 by maintainers)

Top Related StackOverflow Question
I think
MvcNewtonsoftJsonOptionscan getpublic bool ReadJsonWithRequestCulture { get; set; }. When trueCultureInfo.CurrentCultureis set onto the reader.Thoughts?
An ISO date is a good idea because it does not use culture.