29

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

问题是,他们从哪里获得 en-US?从顶部开始,如果我查看“控制面板 > 区域和语言”,所有内容都设置为英语(英国)。网站的 web.configs 要么没有 <globalization> 部分,要么将其设置为 <globalizationculture="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 '$'

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

我错过了什么吗?

4

9 回答 9

27

这些是您可以搜索的替代位置:

我找不到将文化设置为“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. 根网络配置。<windir>\Microsoft.NET\Framework\<ver>\Config\Web.config
  3. 网站。<wwwroot>\Web.config
  4. Web应用程序。<wwwroot>\<webapp>\Web.config
  5. 文件夹。<wwwroot>\<webapp>\<dir>\Web.config

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

于 2012-06-21T09:31:31.837 回答
5

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

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

于 2016-06-30T06:51:50.837 回答
4

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

于 2012-06-21T10:32:29.303 回答
3

.Net Web 应用程序正在选择您浏览器的默认文化。例如,在 FF 中,默认语言设置如下图所示。语言的 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();
        }
    }
于 2016-04-05T16:18:36.703 回答
2

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

检查此链接: IIS 和 ASP.NET 之间的不同文化设置

于 2015-06-12T14:22:50.160 回答
1

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

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

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

于 2018-09-18T08:07:40.933 回答
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;
} 
于 2013-12-13T15:25:07.063 回答
0

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

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

于 2019-04-12T10:51:24.157 回答
0

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

CultureInfo.DefaultThreadCurrentCulture = "en-GB";
CultureInfo.DefaultThreadCurrentUICulture = "en-GB";
于 2020-07-05T13:04:32.327 回答