如何在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" />

另见这里的类似内容:

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

  • 在你的问题中提到输入是一个字符串而不是日期时间对象(“我几乎忘记提及我使用这种格式的所有日期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

    上一篇: How use a specific CultureInfo in Asp.net Web API

    下一篇: How to convert firebase timestamp into date and time