概述
我们有一个跨国网站,其中包含其服务的各个国家/地区的本地化内容。这种本地化是使用标准的 .Net 资源文件实现的。
当我们的 Web 应用程序在生产环境的负载下启动或回收时,有时它会显示特定国家/地区的错误资源。例如,英国站点可能会显示法语内容。
这将继续发生,直到重新启动应用程序。
细节
生产环境是 Windows Server 2012 上的 IIS 8。应用程序在 ASP.Net MVC 4 中实现。
应用程序通过传入的 URL 决定它所服务的语言环境。所以 www.mysite.com 将是英国英语 www.mysite.fr 将是法语等。
我们有一个通过 Web.config 注册的 IHttpModule 实现。在模块的 Init 方法中,它将处理程序附加到 BeginRequest 事件。在此方法中,将检查传入的 URL,并将线程的 CurrentUICulture 设置为适当的值。en-GB 表示 www.mysite.com,fr-FR 表示 www.mysite.fr 等。
该系统在大多数情况下运行良好。但是,有时当应用程序在接收请求时启动时,它会始终为某些资源文件提供错误的内容。
它会继续这样做,直到应用程序重新启动。它可能会再次重新开始提供不正确的内容。我们必须不断重启,直到它提供正确的内容,此时它将保持稳定。
分析
通过在启动期间向应用程序抛出请求(使用 Fiddler),我们已经能够在开发 PC 上本地重现这一点。该网站在英国版网站上显示了一些资源文件的德语内容。
在检查了我们代码中明显的罪魁祸首(HTTP 模块正确设置了 CurrentUICulture 并且在整个请求处理过程中保持正确)之后,我们开始查看资源管理器。
当应用程序在这种不正确的状态下启动时,我们检查了 ResourceManager 类的 _resourceSets 属性的内容。这是一个以 ISO 文化代码为关键字的字典。检查 en-GB 的内容,我们发现它确实包含来自德语版本的资源文件的资源字符串。
有时,当站点在接收请求时启动时,ResourceManager 类似乎为文化加载了错误的资源文件,或者它在其字典中错误地对文件进行了分类。
有没有其他人经历过这种行为,是否有人知道任何解决方法?
谢谢。