【问题标题】:CurrentCulture incorrectly defaulting to en-US in ASP.netCurrentCulture 在 ASP.net 中错误地默认为 en-US
【发布时间】:2012-06-23 12:01:58
【问题描述】:

我刚刚将大约 100 个 ASP.net 站点从 Windows Sever 2003 上的 IIS 6 迁移到 Windows 2008 上的 IIS 7。我刚刚注意到使用 DateTime.Parse 之类的各种代码已经开始出现错误“字符串未被识别为有效的日期时间”。我已将此归结为网站的 CurrentCulture 默认为“en-US”,因此我的英国用户输入的日期格式异常。

问题是,他们从哪里获得 en-US?从顶部开始,如果我查看“控制面板 > 区域和语言”,所有内容都设置为英语(英国)。网站的 web.configs 要么没有 部分,要么将其设置为 。在“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 来解决这个问题,但是我真的不想手动编辑大约 100 个 web.config !我不希望它从设置为 en-GB 的服务器操作系统设置中继承文化。

我错过了什么吗?

【问题讨论】:

  • 您是否检查了 Internet Explorer 语言选项?网站使用这些语言设置来确定当前语言
  • 是的,IE 语言设置为“英语(英国)[en-GB]”。我在所有浏览器中都遇到了同样的问题。
  • 顺便说一句,您如何处理资源?只是 App_GlobalResources 或 App_LocalResources 下的 RESX 文件?或者它们是否嵌入在附属程序集中:
  • 另外,您如何确定代码中的语言,我的意思是您是否将语言保存在 cookie 中?或者它是否存储在当前用户的数据库中?
  • App_LocalResources,但这个特殊问题与用户输入日期和 DateTime.Parse 失败有关,因为它期望的是美国日期,但它不应该是。我没有专门处理代码中的语言,我在来自日历控件的字符串上使用 Convert.ToDateTime。我没有在代码中的任何地方传递特定的文化,我依靠网站从用户的浏览器设置中获取文化。

标签: asp.net globalization culture uiculture


【解决方案1】:

这些是您可以搜索的其他地方:

我找不到将文化设置为“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 层次结构(在服务器上,&lt;wwwroot&gt; 表示您的 IIS 网站的根文件夹)

  1. 全球机器。 &lt;windir&gt;\Microsoft.NET\Framework\&lt;ver&gt;\Config\Machine.config
  2. 根 Web 配置。 &lt;windir&gt;\Microsoft.NET\Framework\&lt;ver&gt;\Config\Web.config
  3. 网站。 &lt;wwwroot&gt;\Web.config
  4. Web 应用程序。 &lt;wwwroot&gt;\&lt;webapp&gt;\Web.config
  5. 文件夹。 &lt;wwwroot&gt;\&lt;webapp&gt;\&lt;dir&gt;\Web.config

如果您有多个服务器(网络场),请检查您是否被重定向到正确的服务器(您正在检查配置的那个),为了做到这一点,您可以使用所需服务器的 ip 或配置您的主机客户端计算机中的文件

【讨论】:

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

我遇到了同样的问题,几个小时后我发现即使区域设置正确,我还需要更改所有保留帐户(例如 ASP.NET)的原始文化.

这是通过区域设置管理选项卡下的“复制设置...”按钮完成的。如果您启用复选框“欢迎屏幕和系统帐户”,则会复制设置。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      .Net Web 应用程序正在选择您浏览器的默认文化。例如在 FF 中,默认语言设置如下图所示。

      因此,如果您希望网站的文化不同于浏览器的文化,请在页面的 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();
              }
          }
      

      【讨论】:

        【解决方案5】:

        它可能来自用于运行应用程序池或 Web 应用程序的系统帐户的文化。

        检查此链接: different culture settings between IIS and ASP.NET

        【讨论】:

          【解决方案6】:

          在我的例子中,我的应用程序池以我的域用户身份运行,它的当前文化设置为 en-GB,并且应用程序在 en-GB 日期格式下运行良好。

          我将应用程序池更改为在网络服务下运行,但突然 DateTime.Parse 调用中断,因为该应用程序现在使用 en-US 文化。我看到一些 SO 帖子 (e.g) 关于 IIS 文化如何是用户特定的,这解释了这一点。

          在 IIS 管理器中打开根元素的 .NET 全球化并将文化和 UI 文化设置为英国英语 (en-GB) 已为我修复了它。

          【讨论】:

            【解决方案7】:

            只是为了帮助遇到同样问题的人....

            在尝试改变 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;
            } 
            

            【讨论】:

              【解决方案8】:

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

              IIS -&gt; Application Pools -&gt; Advanced Settings -&gt; Change "Load User Profile" to False

              【讨论】:

                【解决方案9】:

                我也有这个问题,但我解决了。 您必须设置以下值:

                CultureInfo.DefaultThreadCurrentCulture = "en-GB";
                CultureInfo.DefaultThreadCurrentUICulture = "en-GB";
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-08-04
                  • 2015-01-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-05-03
                  相关资源
                  最近更新 更多