我刚从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。
我错过了什么吗?
答案 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" />
尝试寻找试图设置语言的HttpHandlers或HttpModules
尝试查看web.config层次结构(在服务器上,<wwwroot>
表示IIS网站的根文件夹)
<windir>\Microsoft.NET\Framework\<ver>\Config\Machine.config
<windir>\Microsoft.NET\Framework\<ver>\Config\Web.config
<wwwroot>\Web.config
<wwwroot>\<webapp>\Web.config
<wwwroot>\<webapp>\<dir>\Web.config
如果您有多个服务器(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应用程序的系统帐户的文化。
答案 4 :(得分:2)
.Net网络应用程序正在提升浏览器的默认文化。对于例如在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 :(得分: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";