CurrentCulture在ASP.net中错误地默认为en-US

时间:2012-06-21 09:12:05

标签: asp.net globalization culture uiculture

我刚从Windows Sever 2003上的IIS 6迁移了大约100个ASP.net站点到Windows 2008上的IIS 7.我刚刚注意到使用DateTime.Parse之类的各种代码已经开始启动错误“字符串未被识别为有效的DateTime“。我已经跟踪了这一事实,即网站的CurrentCulture默认为“en-US”,因此我的英国用户以意想不到的格式输入日期。

问题是,他们从哪里来到美国?从顶部开始,如果我查看“控制面板”>地区和语言'一切都设置为英语(英国)。网站的web.configs没有< globalization>部分或将其设置为< globalization culture =“auto”uiCulture =“auto”/>。在'IIS7 - .Net全球化'中,所有网站都将其文化设置为“不变语言(不变国家)”。

我无法找到将文化设置为'en-US'的任何地方......但有些东西是。

Thread.CurrentThread.CurrentCulture.Name is outputting 'en-US'
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol is outputting '$'

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

我错过了什么吗?

9 个答案:

答案 0 :(得分:26)

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

  

我无法找到将文化设置为'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网站的根文件夹)

  1. 全球机器。 <windir>\Microsoft.NET\Framework\<ver>\Config\Machine.config
  2. Root Web配置。 <windir>\Microsoft.NET\Framework\<ver>\Config\Web.config
  3. 网站。 <wwwroot>\Web.config
  4. 网络应用程序。 <wwwroot>\<webapp>\Web.config
  5. 文件夹。 <wwwroot>\<webapp>\<dir>\Web.config
  6. 如果您有多个服务器(Web场),请检查您是否被重定向到正确的服务器(您正在检查配置的服务器),为了做到这一点,您可以使用所需服务器的IP或配置主机客户端计算机中的文件

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

通过区域设置管理标签下的“复制设置... ”按钮完成此操作。如果启用“欢迎屏幕和系统帐户”复选框,则会复制设置。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

.Net网络应用程序正在提升浏览器的默认文化。对于例如在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();
        }
    }

答案 5 :(得分:1)

在我的情况下,我的应用程序池以域用户身份运行,该域用户的当前区域性设置为en-GB,并且该应用程序可以使用en-GB日期格式正常运行。

我将应用程序池更改为在网络服务下运行,突然间,由于应用程序现在使用美国文化,DateTime.Parse调用中断。我看到一些SO帖子(e.g)关于IIS文化如何针对特定用户的解释。

在IIS管理器中打开根元素的.NET全球化,并将“文化”和“ UI文化”都设置为English UK(en-GB),为我修复了该问题。

答案 6 :(得分: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;
} 

答案 7 :(得分:0)

我花了数小时试图为我的案件找到解决方案。我正在Win10(英文版)下工作,但是使用俄罗斯区域设置。但是,我的应用程序中出现了“ en-US”文化,该文化是通过ApplicationPoolIdentity托管在IIS上的。那解决了问题:

IIS -> Application Pools -> Advanced Settings -> Change "Load User Profile" to False

答案 8 :(得分:0)

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

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