0

正如标题所暗示的,我使用 WestWind.globalisation 作为数据库资源提供者来支持多种语言。

问题是,它自己的资源提供者似乎不愿意反映我在应用程序中所做的更改。

一个例子:

我有一个元素:

<asp:Image runat="server" ID="img_placeholder" ImageUrl="~/images/BigPicture.jpg" />

我已将以下数据插入到本地化表中:

pk  ResourceId              Value                          LocaleId  ResourceSet
--------------------------------------------------------------------------------
391 ImgBigPicture.ImageUrl  ~/images/BigPicture-en-US.jpg   en-US    Site.master
392 ImgBigPicture.ImageUrl  ~/images/BigPicture.jpg              Site.master
393 ImgBigPicture.ImageUrl  ~/images/BigPicture-fr-FR.jpg   fr-FR    Site.master

在此之后,我将标记更改为:

<asp:Image runat="server" ID="img_placeholder" ImageUrl="~/images/BigPicture.jpg" meta:resourceKey="ImgBigPicture"/>

当我刷新应用程序或重建它时,更改不会显示在浏览器中。图片网址保持不变。在任何给定元素上都可以观察到相同的情况,无论是 anasp:Label还是 an asp:Button

有时重启 IIS 就足够了;有时重启 Visual Studio 和 Chrome 就足以使更改生效。大多数情况下,我需要重新启动服务器,以便所有内容都以其当前和实际状态显示。当它发生时,我可以切换我的 UIculture 并且属性会相应更改。

我不知道发生了什么,单步执行代码并没有向我透露任何信息。

我愿意接受有关如何应对此问题的任何建议和解决方案。

4

1 回答 1

0

资源集在 .NET 中的工作方式,它们只加载一次,然后缓存在内存中。这意味着当 ASP.NET 第一次请求 ResourceSet 时,资源会被加载,然后在重新启动 AppDomain 之前永远不会再次加载。因此,您对数据库资源所做的任何更改都不会立即反映出来。

在管理表单上,有一个选项可让您卸载 DbResources。dbResourceProvider 支持使用此机制卸载资源以强制在下一次访问时重新加载。因此,除非您这样做,否则资源不会重新加载。

IIS 重新启动、应用程序池回收甚至 web.config 更改(导致 AppDomain 关闭并重新启动的任何事情)也将清除资源并重新开始。

如果您仍然看到相同的资源,您可能正在处理浏览器缓存。特别是 Chrome 的浏览器缓存非常激进,并且图像通常只有在您将它们显式加载到窗口中并进行硬刷新 (Shift-f5) 时才会重新加载。如果您在 Chrome 中进行测试并且想要查看新图像,请使用开发人员工具清除浏览器缓存选项来完全清除缓存(或右键单击刷新按钮并选择清除缓存并重新加载)。

于 2015-03-16T09:03:48.767 回答