我在ASP.NET MVC中有一个多租户应用程序.将要提供的应用程序实例仅仅是主机名的功能(我认为这与stackexchange一致).
应用程序的每个实例可能具有不同的文化设置(甚至"自动",以阅读浏览器的语言并尝试使用它),并将相应地进行本地化.
在这种情况下,我想对我的一些操作做一些输出缓存.所以,我的问题是:
如果输出完全取决于主机名(即忽略本地化要求),那么实现多租户ASP.NET MVC应用程序的输出缓存有哪些可能性?
与(1)相同,但现在考虑输出还取决于培养设置?
与(2)相同,但考虑到输出可能随传递给动作的参数而变化?
在这种情况下,我正在考虑所有站点都从一个IIS网站运行.
我们在某些字符串上调用ToLower()时发现了一个奇怪的错误.
输入字符串是:
string s = "DocumentInfo";
string t = s.ToLower();
// sometimes, t == documentinfo
// other times, t == document?nfo (note dot is missing from i - INCORRECT)
Run Code Online (Sandbox Code Playgroud)
我们将字符串传递给下游的Web服务查询,因此它给我们带来了问题.
我最初的猜测是它与Culture或UICulture有关,因为我们的一些页面为每个用户定制这些设置.
这可能是问题吗?有没有办法可以强迫它正常工作?
更新2011.07.06
我发现我可以通过将Culture设置为tr-TR来复制该问题.不确定其他文化是否会受到影响.
我想为我的整个应用程序设置文化.我尝试了以下方法:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(wantedCulture);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(wantedCulture);
Application.CurrentCulture = CultureInfo.CreateSpecificCulture(wantedCulture);
Run Code Online (Sandbox Code Playgroud)
它适用于当前线程,但稍后我创建并启动后台工作线程.当我创建worker时,当前线程使用wantedCulture执行,但工作线程将使用我的计算机文化运行.
为整个应用程序设置文化的任何想法?
指定CurrentCulture或InvariantCulture而不指定文化的最佳做法是什么?
例如,根据我的阅读,如果您正在进行序列化,则需要使用InvariantCulture作为指定数据值的规范表示的方法.这是基于文化的字符串操作的相对较小的百分比.
我发现它很长,很冗长,而且大部分时间都是丑陋的,每次我都说出来,比如说:
var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName);
Run Code Online (Sandbox Code Playgroud)
然而,我的团队最近开启了FxCop,现在总是在每个地方都使用CultureInfo.结合简洁性,可读性和功能性的最佳技术是什么?
一些好的阅读材料:
从他们的简短摘要描述中,它听起来像字符串比较规则StringComparison.Ordinal,StringComparison.InvariantCulture并且意味着它们如何对字符串进行排序.这就是全部吗?也就是说,这是否意味着我们可以在进行相等比较时使用字符串比较规则?
string.Equals(a, b, StringComparison....)
Run Code Online (Sandbox Code Playgroud)
还有额外的功劳:如果我们进行比较OrdinalIgnoreCase,它会对答案产生影响InvariantCultureIgnoreCase吗?怎么样?
请提供支持论据和/或参考.
这真让我抓狂.我在ASP.NET 2.0 WebForm页面中有以下字符串
string s = "0.009";
Run Code Online (Sandbox Code Playgroud)
很简单.现在,如果我的文化是西班牙语 - 这是"es-ES" - 我尝试将字符串转换为Double,我会执行以下操作:
double d = Double.Parse(s, new CultureInfo("es-ES"));
Run Code Online (Sandbox Code Playgroud)
我期待的是0,009.相反,我得到9.我明白.NET认为它是千分隔符,在en-US中是一个逗号,但不应该把我传递给parse方法的文化信息并应用正确的格式转换?
如果我做
double d = 0.009D;
string formatted = d.ToString(new CultureInfo("es-ES"));
Run Code Online (Sandbox Code Playgroud)
格式化现在是0,009.任何人?
我需要根据每种文化的资源文件在运行时更改文化.
我需要根据指定.resx文件的两种文化来更改表单中控件的属性
resorces1.aspx.resx // default
resorces1.aspx.he-IL.resx // hebrew culture
Run Code Online (Sandbox Code Playgroud)
我可以使用fallback资源加载页面,或者在pageload上提供UICulture = "he-IL"值,并且可以使用所需资源加载.
问题是我需要在运行时进行这些更改.
1 ..在我更改按钮单击事件的值后
btn_change_Click(....)
{
UICulture = "he-IL" ;
}
Run Code Online (Sandbox Code Playgroud)
它仍然返回到"en-US"的初始值
如何在运行时提交对UICulture的更改?
2 ..如果我不知道它是"en-US",我如何引用回退资源文件?
在小数分隔符为a的语言中,(逗号)CSV(逗号分隔值文件格式)分隔符为a; (分号).我知道在Windows控制面板中哪里可以找到此配置,但我不知道如何在.NET应用程序中以progamatically方式找到它.
我猜Thread.CurrentThread.CurrentCulture有这些信息,但我找不到它.
由于(至少在NTFS)在Windows文件系统不区分大小写,我想比较String fileA,以String fileB这样:
fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)
Run Code Online (Sandbox Code Playgroud)
那么问题就变成我应该使用哪种文化,默认的当前(ui?)文化是否足够?我似乎无法为此目的找到任何BCL方法.
给定一个特定的国家代码,例如"CH",我如何获得CultureInfo对象?特定的国家/地区代码是动态的(在运行时更改).我只有国家代码,我想知道是否有可能从创建CultureInfo对象只是国家代码.我得到的确切文化无关紧要(fr-CH/de-CH).
我正在尝试做这样的事情:
CultureInfo c = CultureInfo.CreateSpecificCulture("CH");
Run Code Online (Sandbox Code Playgroud)
是否可以从RegionInfo对象创建文化?然后它看起来像这样:
RegionInfo r= new RegionInfo("CH");
CultureInfo c = CultureInfo.CreateSpecificCulture(r);
Run Code Online (Sandbox Code Playgroud)
显然前面的例子没有编译,他们只是想知道我想要实现的目标.
culture ×10
c# ×7
asp.net ×3
string ×3
.net ×2
cultureinfo ×2
asp.net-mvc ×1
caching ×1
csv ×1
double ×1
equality ×1
filesystems ×1
multi-tenant ×1
region ×1