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