当前文化在ASP.net中默认为en-US的错误

32
我刚把大约100个ASP.net网站从运行在Windows Sever 2003上的IIS 6迁移到了Windows 2008上的IIS 7。我发现使用DateTime.Parse之类的代码会出错,报“String was not recognized as a valid DateTime”的错误。我调查后发现这是因为网站的CurrentCulture默认为'en-US',导致我的英国用户以意外的格式输入日期。
问题是,他们从哪里获得en-US?从顶部开始,如果我在“控制面板>区域和语言”中查看,所有设置都是英文(英国)。网站的web.configs要么没有<globalization>部分,要么将其设置为<globalization culture="auto" uiCulture="auto" />。在'IIS7 - .Net Globalization'中,所有站点的文化设置为'Invariant Language (Invariant Country)'。
我找不到任何将文化设置为'en-US'的地方...但某些东西确实设置了。
Thread.CurrentThread.CurrentCulture.Name is outputting 'en-US'
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol is outputting '$'

我可以通过在每个web.config中添加<globalization culture="en-GB" uiCulture="en-GB" />来解决问题,但我真的不想手动编辑大约100个web.config!我希望它能够从服务器操作系统设置中继承文化设置,这些设置已设置为en-GB。

我有什么遗漏吗?


1
你检查了Internet Explorer语言选项吗?网站使用这些语言设置来确定当前语言。 - Jupaol
是的,IE语言设置为“英语(英国)[en-GB]”。我在所有浏览器中都遇到了同样的问题。 - Siegemos
顺便问一下,你是如何处理资源的?只使用 App_GlobalResources 或 App_LocalResources 下的 RESX 文件吗?还是将它们嵌入到卫星程序集中? - Jupaol
另外,您如何在代码中确定语言?我的意思是,您是否将语言保存在cookie中?还是可能将其存储在当前用户的数据库中? - Jupaol
App_LocalResources,但这个问题与用户输入日期有关,DateTime.Parse失败是因为它期望一个美国日期,而实际上不应该是这样的。我没有在代码中特别处理语言,我正在使用Convert.ToDateTime将来自日历控件的字符串转换为日期。我没有在代码中传递特定的文化设置,我依靠网站从用户浏览器设置中获取文化设置。 - Siegemos
可能是由于CurrentUICulture对于任何英语版本始终为en-US,因此CurrentCulture被设置的区域文化信息可能来自于UI Culture。你是否尝试设置非英语语言,特别是一些按照不同日期格式显示的变体语言? - nicodemus13
10个回答

28

以下是您可以搜索的替代地点:

我找不到任何地方将区域设置为'en-US',但某些地方是这样设置的。

Thread.CurrentThread.CurrentCulture.Name 输出的是 'en-US', Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol 输出的是 '$'

尝试查找InitializeCulture方法,此方法在ASP.Net页面中被覆盖以设置区域设置,例如:

protected override void InitializeCulture()
{
    var hidden = this.Request.Form["hidden"];
    var culture = this.Request.Form[hidden];
    if (!string.IsNullOrWhiteSpace(culture))
    {
        this.Culture = culture;
        this.UICulture = culture;
    }

    base.InitializeCulture();
}

尝试查找以下汇编属性:

    [assembly: AssemblyCulture("en-US")]
    [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]

尝试查找以下页面指令属性:

    <%@ Page Culture="en-US" UICulture="en-US" Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

尝试查看web.configs:

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

编辑1

尝试查找尝试设置语言的HttpHandlers或HttpModules

尝试在web.config层次结构中查找(在服务器上,<wwwroot>表示您的IIS Web Site的根文件夹)

  1. 全局机器。 <windir>\Microsoft.NET\Framework\<ver>\Config\Machine.config
  2. 根Web config。 <windir>\Microsoft.NET\Framework\<ver>\Config\Web.config
  3. 网站。 <wwwroot>\Web.config
  4. Web应用程序。 <wwwroot>\<webapp>\Web.config
  5. 文件夹。 <wwwroot>\<webapp>\<dir>\Web.config

如果您有多个服务器(Web farm),请检查是否被重定向到正确的服务器(您正在检查配置的那个服务器)。为此,您可以使用所需服务器的IP或在客户端计算机中配置主机文件。


我已经搜索了整个解决方案中的所有代码,但没有找到相关的出现。问题是,这是在之前的Windows 2003服务器上运行的相同代码,以前从未出现过此问题,因此我认为这不是代码问题,而是服务器/IIS某处的设置问题。问题是在哪里? - Siegemos
如果您在2或3个随机应用程序的web.config中手动更改语言,您是否可以获得所需的语言?如果是,那么您将放弃部署问题。 - Jupaol
是的,如果我将它添加到web.config的全球化部分,特别是'en-GB',那么一切都很好,但我想避免为所有站点执行此操作,并在可能的情况下解决实际获取en-US的问题并在该级别进行更改。 - Siegemos
顺便提一下,我没有使用Web Deploy来部署这些网站。它们最初是手动设置的。 - Siegemos
Machine.config - 没有全球化部分,也没有提到en-US 根web.config - 没有全球化部分 网站 - 没有全球化部分 Web应用程序 - 不适用 文件夹 - 不适用 :(. - Siegemos

9
我遇到了同样的问题,经过多个小时的研究,我发现即使区域设置正确,我也需要更改所有保留帐户(例如ASP.NET)的原始文化。
这可以通过在“区域设置”中的“管理”选项卡下找到“复制设置…”按钮来完成。如果您启用复选框“欢迎屏幕和系统帐户”,则会复制这些设置。

1
天啊,伙计,那是我需要做的最后一次更改,我改了所有东西...所有的东西!非常感谢。我整天都在搞这个...我想我要因为开心而哭泣了。 - ZeroCodeException

4
如果我在根web.config (windir\Microsoft.NET\Framework\ver\Config\Web.config)中添加一个全球化部分,并将其设置为en-GB,它可以解决我的问题并向其他网站传播。这样就解决了我的问题。但是默认情况下它从哪里获取en-US仍然没有解释清楚,但这应该可以解决问题。谢谢。

3
.Net Web应用程序采用您浏览器的默认语言环境。例如,在FF中,将默认语言设置如下所示:FF settings for Language 因此,如果您希望网站使用不同于浏览器的语言环境,在页面的InitializeCulture方法中(创建一个BasePage,并在此处添加以下代码,并从该BasePage继承现有页面)。
protected override void InitializeCulture()
    {
            System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo("en-GB");
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;

            base.InitializeCulture();
        }
    }

2

1
在我的案例中,我的应用程序池以我的域用户身份运行,该用户将当前区域设置为en-GB,并且应用程序可以正常使用en-GB日期格式。我将应用程序池更改为使用Network Service运行,然后突然间DateTime.Parse调用失败了,因为应用程序现在使用的是en-US文化。我看到一些Stack Overflow帖子(例如)解释了IIS文化是特定于用户的。在IIS Manager中打开根元素的.NET全球化,并将Culture和UI Culture都设置为英国英语(en-GB),这为我解决了问题。

0
我花了几个小时试图找到一个解决方案。我正在 Win10(英文版)下工作,但是区域设置是俄语。尽管如此,在托管在具有 ApplicationPoolIdentity 的 IIS 上的应用程序中,我获得了“en-US”文化。 这解决了问题:

IIS -> 应用程序池 -> 高级设置 -> 将“加载用户配置文件”更改为 False


0

只是为了帮助有相同问题的人...

在尝试更改IIS文化、设置全球化等方法都无法成功后,我在Global.asax中进行了操作:

void Application_BeginRequest(Object sender, EventArgs e)
{
    System.Globalization.CultureInfo newCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();

    newCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
    newCulture.DateTimeFormat.DateSeparator = "/";

    System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
} 

0
我也遇到了这个问题,但是我解决了它。 你必须设置以下值:
CultureInfo.DefaultThreadCurrentCulture = "en-GB";
CultureInfo.DefaultThreadCurrentUICulture = "en-GB";

0

我在Windows Server Core 2022安装中遇到了这个问题,因此没有像“区域设置”选项卡中的“复制设置”那样简单的UI解决方案。 我想要一个Powershell或CLI解决方案,就像你所说的,它可以应用于用户,但不能复制到所有用户。

为此,我从Lewis Roberts的博客文章https://www.lewisroberts.com/2017/03/01/set-language-culture-timezone-using-powershell/中获得了帮助。

您需要使用control.exe导入区域设置XML文件。 以下内容适用于英国地区的en-GB,请根据您的要求进行调整。

将以下XML保存到名为UKRegion.xml或其他任何名称的文件中。

<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"> 
<!--User List-->
<gs:UserList>
    <gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/> 
</gs:UserList>
<!-- user locale -->
<gs:UserLocale> 
    <gs:Locale Name="en-GB" SetAsCurrent="true"/> 
</gs:UserLocale>
<!-- system locale -->
<gs:SystemLocale Name="en-GB"/>
<!-- GeoID -->
<gs:LocationPreferences> 
    <gs:GeoID Value="242"/> 
</gs:LocationPreferences>
<gs:MUILanguagePreferences>
    <gs:MUILanguage Value="en-GB"/>
    <gs:MUIFallback Value="en-US"/>
</gs:MUILanguagePreferences>
<!-- input preferences -->
<gs:InputPreferences>
    <!--en-GB-->
    <gs:InputLanguageID Action="add" ID="0809:00000809" Default="true"/> 
</gs:InputPreferences>
</gs:GlobalizationServices>

然后使用以下命令(Powershell格式)导入:

& $env:SystemRoot\System32\control.exe "intl.cpl,,/f:`"UKRegion.xml`""

你仍然需要重新启动,但这对我有用,并将ASP.NET工作程序默认设置为使用en-GB区域设置,而无需在代码或web.config中进行设置。

对我来说,这特别有用,因为我正在使用它来使用启动模板设置EC2实例,因此许多其他解决方案都不起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接