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

C# 如何在Asp.net Web API中使用特定的CultureInfo,c#,json,date,asp.net-web-api,date-formatting,C#,Json,Date,Asp.net Web Api,Date Formatting,我最近在一个现有的VS桌面应用程序中添加了WebAPI,一切都很好,直到昨天我不得不添加一个GET方法,该方法包含三个参数,其中一个是日期。 好吧,起初我认为这是小菜一碟,但令我惊讶的是,当我在安装应用程序的服务器上发送2014/07/09(7月9日)时,它被视为2014/09/07(9月7日),因此我所有的比较都不起作用 我尝试过从GET方法更改为POST方法,在服务器上将区域和语言选项设置更改为相同的设置,将日期作为字符串传递。在服务器上使用字符串的部分创建了Datetime对象。不幸的是,

我最近在一个现有的VS桌面应用程序中添加了WebAPI,一切都很好,直到昨天我不得不添加一个GET方法,该方法包含三个参数,其中一个是日期。 好吧,起初我认为这是小菜一碟,但令我惊讶的是,当我在安装应用程序的服务器上发送2014/07/09(7月9日)时,它被视为2014/09/07(9月7日),因此我所有的比较都不起作用

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

然后我记得这个桌面应用程序在其WCF项目上有一些方法(我现在将其传递给WebAPI),这些方法传递日期时没有任何问题。查看代码一段时间后,我发现他们在使用日期的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中使用过类似的东西?如果是这样的话,您是如何以及在何处放置这样的配置的

以下是我的电脑上的设置:

以下是服务器设置:

<globalization 
    enableClientBasedCulture="false" 
    uiCulture="en-US" 
    culture="en-US" />

我几乎忘了提到,我使用这种格式传递所有日期,而所有其他参数都使用json。 是否因为我没有指定要使用的区域性信息,所以当字符串在Web API中反序列化时,这是使用系统日期格式来完成的??或者,在尝试序列化/反序列化日期时可能是Json错误

一如既往,我们将非常感谢您提供的任何建议或资源。

如评论中所述,ASP.NET运行时确实为这些场景提供了解决方案:它是
web.cofig
元素-(请参阅MSDN)

其结构定义为:

<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"/>
这将为任何http请求使用适当的(期望的和设置的)区域性

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

<globalization 
    requestEncoding="utf-8" 
    responseEncoding="utf-8" 
    fileEncoding="" 
    culture="" 
    uiCulture="" 
    enableClientBasedCulture="false" 
    responseHeaderEncoding="utf-8" 
    resourceProviderFactoryType="" 
    enableBestFitResponseEncoding="false" />

请参见此处的类似内容:

  • 还有它本身

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

尽管Radim发布的设置有效,但它不是一个修复,而是一个破解/解决方案

有两种建议的方法来实现这一点:

  • 在两端使用字符串,即API参数也应为字符串,API规范应说明使用的日期格式。使用DateTime.Parse(String,IFormatProvider)并在将输入字符串转换为DateTime时指定合同中的区域性(即新的CultureInfo(“es PE”))。

  • 在两端使用日期对象。在这种情况下,序列化程序将把日期对象序列化为众所周知的、独立于区域性的格式,而desrializer将反序列化字符串以更正DateTime对象

    公共作废GetOrders(DatetTime fromDate)

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

    另见:

    请尝试阅读此内容,它可以为您提供一些想法,如何设置web.config。。。也许这会有帮助。@RadimKöhler谢谢,我会尝试一下,但是对于asp.net MVC来说,这看起来更像是一个问题,我的问题是Web api。这个设置,是运行时设置,也就是说,不管asp.net、MVC、Web api。。这是一种方式,如何说明服务器上的默认区域性是什么(运行时会关心我们在任何线程上设置它),或者我们是否会使用用户区域性(在web api中使用JSON…独立于区域性的格式不是一种好方法)@RadimKöhler感谢它的魅力所在。很抱歉从一开始就不信任你。只是我在WebApiConfig.cs或Global.asax中看到一些试图改变这一点的页面,我认为您误解了我在问题中所描述的内容。所以非常感谢你,再一次抱歉