首页 文章

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

提问于
浏览
26

我刚刚从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全球化'中,所有网站都将其文化设置为“不变语言(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.configs!我不想从服务器操作系统设置继承文化,这些设置设置为en-GB .

我错过了什么吗?

7 回答

  • 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网站的根文件夹)

    • 全球机器 . <windir>\Microsoft.NET\Framework\<ver>\Config\Machine.config

    • Root Web配置 . <windir>\Microsoft.NET\Framework\<ver>\Config\Web.config

    • 网站 . <wwwroot>\Web.config

    • Web应用程序 . <wwwroot>\<webapp>\Web.config

    • 文件夹 . <wwwroot>\<webapp>\<dir>\Web.config

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

  • 2

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

  • 0

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

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

  • 4

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

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

  • 2

    .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();
            }
        }
    
  • 1

    就我而言,我的应用程序池作为我的域用户运行,其当前文化设置为en-GB,并且应用程序在en-GB日期格式下正常运行 .

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

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

  • 4

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

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

相关问题