【问题标题】:DBResourceprovider is not getting called没有调用数据库资源提供程序
【发布时间】:2014-08-08 10:56:12
【问题描述】:

我正在尝试基于此MSDN article 推出我自己的 DBResourceProviderFactory。

我下载了代码并打开了解决方案。首先,我不想要单独的解决方案。资源提供者应该在我的 Web 应用程序中。所以我将所有代码文件(DBResourceProviderFactory.cs DBResourceProvider.cs StringResourcesDALC.cs ...)复制到我的项目中并更正了命名空间,修复了本地资源并相应地编辑了 DALC 中的连接字符串。

在 web.config 中我添加了这个全局配置:

<system.web>
    <!--If MyApllicationNamespace is ommited, exception is thrown at runtime.-->
    <globalization culture="auto" uiCulture="auto" resourceProviderFactoryType="MyApplicationNamespace.DBResourceProviderFactory" />
</system.web>

在 default.aspx 我添加了这个标签:

<asp:Label ID="lblHello" runat="server" Text="not translated" meta:resourceKey="lblHello"></asp:Label>

数据库表包含此资源的 3 行数据。

在构建应用程序并在浏览器中运行它时,标签会保持其初始文本“未翻译”,并且我在 DBResourceProdivder 类中设置的所有断点都不会被命中,因此永远不会调用代码。

我的问题是:为什么它从来没有被调用过?

附加信息: 存在2个标签,在数据库中有对应的resourceKeys

<asp:Label ID="lblHello" runat="server"  Text="HelloDefault" meta:resourcekey="lblHello" />
<asp:Label ID="lblGoodbye" runat="server"  Text="GoodByeDefault" meta:resourcekey="lblGoodbye" />

ResourceType | CultureCode | ResourceKey     | ResourceValue 
---------------------------------------------------------------
Default.aspx | de-DE       |lblHello.Text   | Hallo (de-DE) 
Default.aspx | en-US       |lblHello.Text   | Hello (en-US) 
Default.aspx | fr-FR       |lblHello.Text   | Bonjour (fr-FR) 
Default.aspx | en          |lblHello.Text   | Hello (en) 
Default.aspx | de-DE       |lblGoodbye.Text | Tschüss (de-DE) 
Default.aspx | en-US       |lblGoodbye.Text | good bye(en-US) 

由于某种原因(我不知道为什么)lblHello 被正确本地化,而 lblGoodbye 没有。

我也可以写&lt;asp:label id="lblhello" runat="server" text="&lt;%$ resources: default.aspx, lblhello.text %&gt;" /&gt;。这也有效。

在GetObject方法中,有一行调试器:

Debug.WriteLine(String.Format(CultureInfo.InvariantCulture, "DBResourceProvider.GetObject({0}, {1}) - type:{2}", resourceKey, culture, this.m_classKey));

如果客户端调用 Default.aspx,则此行会出现在输出窗口中:

DBResourceProvider.GetObject(lblhello.Text, ) - type:Default.aspx

但是对于 lblGoodbye,没有调用 DBResourceProvider,这很奇怪。好像没有注册新标签,或者没有读取元标记。

更新: 我已经阅读了更多有关该主题的内容。显然,资源被缓存并且在应用程序关闭之前不会被释放。在我的书中,这意味着 AppDomain 被回收。我读过的每个资源都提供了重新加载 AppDomain 的相同方法:

  • 更改Bin文件夹的内容(添加一个txt文件f.e.)
  • 通过插入换行符或更改上次修改日期来更改 web.config。
  • 通过更改 system.webtrust 部分来更改 web.config
  • HttpRuntime.UnloadAppDomain()
  • 清除当前 Http 当前上下文的 asp.net 应用程序缓存
  • 删除 /AppData/... 文件夹中的临时 asp.net 数据

我已经尝试了所有方法,但我无法强制环境转储每个临时文件/缓存位,它必须重新加载资源并正确显示它们。我的问题不是 Resourceprovider 没有被调用,而是资源被无限缓存并且没有被正确刷新。

【问题讨论】:

  • IISreset 无效。我将提取数据并将其编辑为我的问题。
  • 这与我的问题有什么关系?
  • 明确一点:我不知道lblHello 现在正在工作。星期五,当我离开办公室时,它没有。而且我不知道为什么 lblGoodBye 不起作用。我所知道的是:如果我从后面的代码中设置属性,它就可以工作。将 [assembly: NeutralResourcesLanguage("en-US")] 注入自定义提供程序不会改变任何东西,我可以即时发现
  • 是的 - 它在美国。如果我将其切换为德语,则为 de-DE。
  • 正确。它显示.Text 属性中指定的默认文本,除非我在后面的代码中设置this.lblGoodbye.Text = GetLocalResourceObject("lblGoodbye.Text") as string;

标签: c# asp.net globalization


【解决方案1】:

您的问题可能与使用隐式本地资源时涉及的两个阶段有关。对于您链接到的页面:

在页面解析步骤中,提供程序用于检索所有本地 页面资源;显式表达式被验证;并且,在 编译,也为页面生成代码。对于本地资源, 资源阅读器用于为隐式表达式生成代码。 验证本地和全局资源的显式表达式 在适当的提供者上单独调用 GetObject()。

在运行时,解析器生成的代码触发对 GetObject() 的调用 在页面初始化时检索本地和全局资源。

作为解析阶段的一部分,DBResourceProviderFactory.CreateLocalResourceProvider 方法被调用,这反过来又导致DBResourceProvider 构造函数被调用。之后,框架“调用”DBResourceProvider 实例上的ResourceReader 属性,这反过来又导致以下行执行:

ListDictionary resourceDictionary = this.m_dalc.GetResourcesByCulture(CultureInfo.InvariantCulture);

这似乎被框架用来以某种方式构建资源键的字典(或其他东西)。

在页面周期的后期,对于未添加到字典中的键,将跳过对 DBResourceProvider.GetObject 的调用。

但是如果你检查StringResourcesDALC类的实现,它实际上会在GetResourcesByCulture方法中用不变的英语文化替换InvariantCulture

这意味着您必须在您的数据库表中有一行以en 作为CultureCode,如果您希望它起作用。

在您的示例数据中,您这一行:

 Default.aspx | en          |lblHello.Text   | Hello (en)

但你没有

 Default.aspx | en          |lblGoodbye.Text | Goodbye (en)

因此,要解决此问题,请添加该行。然后,为了更好地衡量,重建解决方案并测试会发生什么。

【讨论】:

  • resourceProvider 中没有缓存(注释掉)。重新编译没有任何效果
  • @Serv Weird... 但老实说,我写了这个答案而没有实际下载源代码并测试自己。我会看看我是否可以:1)重现你的问题,2)解决它。如果不是,我将删除答案...
  • 默认值似乎可以解决问题。我需要在白天晚些时候再次检查。如果这是原因并解决了我的问题,那么这是 100rep 物有所值,物有所值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多