Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未调用DBResourceprovider_C#_Asp.net_Globalization - Fatal编程技术网

C# 未调用DBResourceprovider

C# 未调用DBResourceprovider,c#,asp.net,globalization,C#,Asp.net,Globalization,我正试图基于此推出自己的DBResourceProviderFactory 我下载了代码并打开了解决方案。首先,我不想要一个单独的解决方案。资源提供者应该在我的web应用程序中。因此,我将所有代码文件(DBResourceProviderFactory.cs DBResourceProvider.cs StringResourcesDLC.cs…)复制到我的项目中,并更正了名称空间,修复了本地资源,并相应地编辑了DALC中的connectionstring 在web.config中,我添加了此g

我正试图基于此推出自己的DBResourceProviderFactory

我下载了代码并打开了解决方案。首先,我不想要一个单独的解决方案。资源提供者应该在我的web应用程序中。因此,我将所有代码文件(DBResourceProviderFactory.cs DBResourceProvider.cs StringResourcesDLC.cs…)复制到我的项目中,并更正了名称空间,修复了本地资源,并相应地编辑了DALC中的connectionstring

在web.config中,我添加了此gloablization配置:

<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:

  • 更改
    Bin
    文件夹的内容(添加txt文件f.e.)
  • 通过插入换行符或更改上次修改的日期来更改web.config
  • system.web
    trust
    部分更改web.config
  • 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)