C# 未调用DBResourceprovider
我正试图基于此推出自己的DBResourceProviderFactory 我下载了代码并打开了解决方案。首先,我不想要一个单独的解决方案。资源提供者应该在我的web应用程序中。因此,我将所有代码文件(DBResourceProviderFactory.cs DBResourceProvider.cs StringResourcesDLC.cs…)复制到我的项目中,并更正了名称空间,修复了本地资源,并相应地编辑了DALC中的connectionstring 在web.config中,我添加了此gloablization配置:C# 未调用DBResourceprovider,c#,asp.net,globalization,C#,Asp.net,Globalization,我正试图基于此推出自己的DBResourceProviderFactory 我下载了代码并打开了解决方案。首先,我不想要一个单独的解决方案。资源提供者应该在我的web应用程序中。因此,我将所有代码文件(DBResourceProviderFactory.cs DBResourceProvider.cs StringResourcesDLC.cs…)复制到我的项目中,并更正了名称空间,修复了本地资源,并相应地编辑了DALC中的connectionstring 在web.config中,我添加了此g
<system.web>
<!--If MyApllicationNamespace is ommited, exception is thrown at runtime.-->
<globalization culture="auto" uiCulture="auto" resourceProviderFactoryType="MyApplicationNamespace.DBResourceProviderFactory" />
</system.web>
如果客户端调用Default.aspx,则该行显示在输出窗口中:
DBResourceProvider.GetObject(lblhello.Text, ) - type:Default.aspx
但是没有为lblGoodbye调用DBResourceProvider,这太奇怪了。就好像新标签没有注册,或者元标签没有被读取一样
更新:
我读了更多关于这个话题的内容。显然,资源会被缓存,直到应用程序关闭后才会释放。在我的书中,这意味着AppDomain被回收。我读过的每个资源都提供了相同的方法来重新加载AppDomain:
- 更改
文件夹的内容(添加txt文件f.e.)Bin
- 通过插入换行符或更改上次修改的日期来更改web.config
- 在
或system.web
部分更改web.configtrust
HttpRuntime.UnloadAppDomain()
- 清除当前Http当前上下文的asp.net应用程序缓存
- 删除/AppData/…中的临时asp.net数据。。。文件夹
我已经尝试了所有方法,但是我无法强制环境转储它必须重新加载资源并正确显示的每个临时文件/缓存位。我的问题不是Resourceprovider没有被调用,而是资源被无限缓存并且没有被正确刷新。您的问题可能与使用隐式本地资源时涉及的两个阶段有关。对于链接到的页面: 在页面解析步骤中,提供程序用于检索所有本地 一个页面的资源;验证显式表达式;而且在 编译时,也会为页面生成代码。对于本地资源, 资源读取器用于为隐式表达式生成代码。 验证本地和全局资源的显式表达式 分别调用相应提供程序上的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)
但你没有:
因此,要解决这个问题,请添加该行。然后,重新构建解决方案并测试发生了什么。IISreset没有效果。我将取出数据并将其编辑到我的问题中。这与我的问题有什么关系?需要明确的是:我不知道为什么lblHello现在正在工作。我离开办公室时,星期五没有。我不知道为什么lblGoodBye不起作用。我所知道的是:如果我从代码隐藏中设置属性,它正在工作。将[assembly:NeutralResourcesLanguage(“en-US”)]注入到自定义提供程序中不会改变任何东西,我可以在flyYes上看到这一点-它是en-US。如果我把它换成德语,它是正确的。它显示
.Text
属性中指定的默认文本,除非我将this.lblGoodbye.Text=GetLocalResourceObject(“lblGoodbye.Text”)设置为字符串代码>位于代码隐藏中。resourceProvider中没有缓存(已注释掉)。重新编译不会显示任何错误effect@Serv奇怪的但老实说,我写了这个答案,并没有真正下载源代码和测试自己。我会看看我是否能:1)重现你的问题,2)解决它。如果不是,我将删除答案…默认值似乎起到了作用。今天晚些时候我需要再检查一下。如果这是原因并解决了我的问题,那么这就是100rep的花费和def的收入
DBResourceProvider.GetObject(lblhello.Text, ) - type:Default.aspx
ListDictionary resourceDictionary = this.m_dalc.GetResourcesByCulture(CultureInfo.InvariantCulture);
Default.aspx | en |lblHello.Text | Hello (en)
Default.aspx | en |lblGoodbye.Text | Goodbye (en)