如何在Asp.net Web API中使用特定的CultureInfo
我最近添加了WEB API到现有的VS桌面应用程序,并且一切正常,直到昨天我必须添加一个带有三个参数的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 =新的CultureInfo(“es-PE”,False) ,必须在那里。 现在我想知道您之前是否在Web API中使用过类似的东西? 如果是的话,你如何以及在哪里放置了这样的配置。
这些是我的电脑上的设置:
这些是服务器设置:
我几乎忘了提及我使用这种格式yyyy / M / d将所有日期与使用json的所有其他参数一起传递。 这可能是因为当字符串在Web API中反序列化时,这是使用系统日期格式完成的,因为我没有指定要使用的区域性信息? 或者尝试序列化/反序列化日期时可能是Json错误?
一如往常,任何建议或资源,你可以提供将不胜感激。
正如在注释中所讨论的,ASP.NET运行时确实为这些场景提供了一个解决方案:它是web.cofig
元素<globalization>
- (请参阅MSDN <globalization>
元素)
它的结构被定义为:
<configuration>
<system.web>
<globalization
enableClientBasedCulture="true|false"
requestEncoding="any valid encoding string"
responseEncoding="any valid encoding string"
fileEncoding="any valid encoding string"
responseHeaderEncoding = "any valid encoding string"
resourceProviderFactoryType = string
enableBestFitResponseEncoding = "true|false"
culture="any valid culture string"
uiCulture="any valid culture string"/>
因此,如果我们想要强制服务器/ dev工作站在en-US
文化中行动,我们应该使用以下显式设置:
<globalization
enableClientBasedCulture="false"
uiCulture="en-US"
culture="en-US" />
这将为任何http请求使用适当的(期望的和设置的)文化。
也有趣的可能是默认设置概述:
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
fileEncoding=""
culture=""
uiCulture=""
enableClientBasedCulture="false"
responseHeaderEncoding="utf-8"
resourceProviderFactoryType=""
enableBestFitResponseEncoding="false" />
另见这里的类似内容:
在你的问题中提到输入是一个字符串而不是日期时间对象(“我几乎忘记提及我使用这种格式的所有日期yyyy / M / d”)。 你的服务接口没有发布,但我想参数类型是DateTime,这就是反序列化不正确的原因。
虽然Radim发布的设置不是一个修复,但是是一种黑客/解决方法。
有两种推荐的方式来实现这一点:
在两端使用字符串,即API参数也应该是字符串,并且API规范应说明要使用的日期格式。 当输入字符串转换为DateTime时,使用DateTime.Parse(String,IFormatProvider)并指定合约中的区域性(即新CultureInfo(“es-PE”))。 https://msdn.microsoft.com/en-gb/kc8s65zs
在两端使用日期对象。 在这种情况下,序列化器会将日期对象序列化为众所周知的独立于文化的格式,并且解序器将反序列化字符串以纠正DateTime对象。
public void GetOrders(DatetTime fromDate)
我会选择#2,因为它是通用的,不会强制客户使用特定的文化。
另请参阅:“正确”的JSON日期格式
链接地址: http://www.djcxy.com/p/46665.html