如何在Asp.net Web API中使用特定的CultureInfo

我最近在现有的VS桌面应用程序中添加了WEB API,一切正常,直到昨天我必须添加一个带有三个参数的GET方法,其中一个是Date。 好吧,起初我认为那将是一块蛋糕,但令我惊讶的是,我注意到当我在安装应用程序的服务器上发送2014/07/09(7月9日)时,它被视为2014年/ 09/07(9月7日)因此我所有的比较都没有奏效。

我尝试过从GET方法更改为POST方法,在服务器上更改区域和语言选项设置,将日期作为字符串传递,使用字符串的部分在服务器上创建Datetime对象。 不幸的是他们都没有工作。

然后我记得这个桌面应用程序在其WCF项目上有一些方法(我现在传递给web API),它完全没有问题地传递日期。 查看代码一段时间后,我发现他们在使用日期的WCF项目的每个类中使用了类似的东西:

Imports System.Globalization Imports System.Security.Permissions Imports System.Threading Public Class ServicioRemotoVentas Implements IServicioRemotoVentas Public Sub New() MyBase.New() Thread.CurrentThread.CurrentCulture = New CultureInfo("es-PE", False) End Sub 

当然这个Thread.CurrentThread.CurrentCulture = New CultureInfo(“es-PE”,False)必须存在。 现在我想知道你以前是否在Web API中使用过类似的东西? 如果是这样,你如何以及在哪里放置这样的配置。

这些是我电脑上的设置:

在此处输入图像描述

在此处输入图像描述

这些是服务器设置:

在此处输入图像描述在此处输入图像描述

我几乎忘了提到我使用这个格式yyyy / M / d以及使用json的所有其他参数传递所有日期。 是否可能在Web API中对字符串进行反序列化时,这是使用系统日期格式完成的,因为我没有指定要使用的文化信息? 或者在尝试序列化/反序列化日期时可能是Json错误?

与往常一样,您可以提供的任何建议或资源将不胜感激。

正如评论中所讨论的 ,ASP.NET运行时确实有针对这些场景的解决方案:它是web.cofig元素(参见MSDN Element )

它的结构定义为:

    

因此,如果我们要强制服务器/开发工作站在en-US文化中运行,我们应该使用这些显式设置:

  

这将为任何http请求使用正确的(期望的和设置的)文化。

同样有趣的可能是默认设置概述:

  

另见类似的:

  • 根据浏览器接受语言自动设置uiCulture
  • 如何更改我的计算机的cultureInfo
  • 和全球化元素本身

在你的问题中提到输入是一个字符串而不是一个日期时间对象(“我几乎忘了提到我使用这种格式yyyy / M / d传递所有日期”)。 您的服务接口未发布但我猜参数类型是DateTime,这就是反序列化不正确的原因。

尽管Radim发布的设置不是一个修复,而是一个黑客/解决方法。

有两种推荐的方法可以实现这一点:

  1. 在两端使用字符串,即API参数也应该是字符串,API规范应说明要使用的日期格式。 当输入字符串转换为DateTime时,使用DateTime.Parse(String,IFormatProvider)并在合同中指定文化(即新的CultureInfo(“es-PE”))。 https://msdn.microsoft.com/en-gb/kc8s65zs

  2. 在两端使用日期对象。 在这种情况下,序列化程序会将日期对象序列化为众所周知的独立于文化的格式,并且解析器将反序列化字符串以更正DateTime对象。

    public void GetOrders(DatetTime fromDate)

我会选择#2,因为它是通用的,不会强迫客户使用特定的文化。

另请参阅: “正确”的JSON日期格式