2009年1月20日,星期二

适用于SharePoint网站的更好的配置存储

我最近对我的手机做了一些改进 Codeplex上的配置存储框架 我现在准备分享。其中许多增强功能是将解决方案适应于大型项目的结果,在该项目中我们为80-100个Internet站点构建了一个平台-因此,它现在变得更加“企业化”。有了这些东西,我通常会与我的雇主达成协议,在我的业余时间从事我的工作(或大部分工作),然后公开分享代码,所以我们开始。在深入研究细节之前,让我们提醒一下配置存储的全部含义:

回顾-简而言之,SharePoint配置存储

普通读者可能会记得这是一个解决方案,它允许使用SharePoint列表来存储SharePoint应用程序使用的配置值-想法是您的Webparts /服务器控件/页面布局等在此处存储配置所需的任何字符串/数据。作为web.config或类似文件的更灵活替代。由于我们的值现在位于SharePoint列表中,因此可以在服务器场中更新配置 通过浏览器 拥有适当权限的管理员。我们还可以选择利用列表提供的所有其他功能,例如审核,项目级别的安全性,警报和版本历史记录等。最后,当您的代码获取配置值时,可以使用缓存层来避免往返。

在我的团队使用过的最后几个项目中,我们已经在列表中完成了100多个配置项目-存储来自URL,字符串和“应用程序行为”开关的各种内容:

ConfigStore

如果您需要更完整的概述,请参阅:

新版本中的增强功能

  1. 可选的"hierarchical"与web.config类似的配置模型

    在第一个版本中,由于所有配置值都存储在一个列表中,这意味着您的配置存储在一个“指定”网站集中。这对于仅使用一个网站集,但可能不容易映射到某些企业要求的WCM网站来说是很好的。此版本中的新功能是,该框架现在可以使用“分层”模型,该模型中的任何站点集合中都存在一个Config Store列表,但是指定了一个包含“主”配置值的“主”站点集合。发生的情况是,如果您请求的配置项位于“本地”配置存储中,则将获得该值,否则,您将从主列表中获得该值。这允许在需要时局部覆盖父值-在实践中,我们发现95%的配置项仅存储在主列表中,但是具有覆盖其他5%的功能对于支持我们开发的某些功能至关重要。

    不用说,这是最适合的实现 我们的 要求。可能不是很适合您,但是开发人员可以考虑从我的源代码开始并进行修改,因为其他方面(例如缓存层,Feature文件,事件处理程序等)可能不需要太多更改。

    如果您想继续仅使用一个配置存储列表(即使您使用了多个网站集中的配置值),那么新代码也将继续适用于该模型。

  2. 在ASPX标记中更易于使用

    与我最近的语言存储库框架类似,配置存储库现在支持通过实现表达式构建器轻松地将值拖放到ASPX标记中。因此,如果您要做的只是设置控件的Text属性,那么现在就可以执行此操作而不会使后面的代码混乱。或者,作为替代示例,在这里我们从配置存储中检索URL(存储在类别'PageUrls'和键'MyAccountPage'中)以分配给超链接:
    <asp:HyperLink id="hyperlink1" NavigateUrl="<%$ SPConfigStore:PageUrls|MyAccountPage %>"
    Text="My account" ImageUrl="images/pict.jpg" runat="server"/>


  3. 修复了服务器场环境的缓存错误

    是的,我必须坚持到这里-初始版本中的缓存层无法充分处理多个服务器。结果是需要回收应用程序池来获取对配置值的更改,而不是立即生效。并非世界末日,但一定会带来不便,并且剥夺了使用SharePoint列表进行配置的一些好处。因此,在此版本中,实现正确地依赖于后端资源(使用 CacheDependency),以使服务器场中所有服务器上的缓存无效。我选择的实现是使用文本文件上的CacheDependency将项目添加到缓存中-该项目必须位于所有服务器都可以访问的路径上,并且事件处理程序现在更新文件中的时间戳以使该项目无效。所有服务器上的缓存。

    我使用文件作为依赖项,因为我认为它比使用 SqlCacheDependency -我并不想强加SQL配置等以能够使用Config Store。但是,根据我选择的文件缓存依赖性,请注意,某些生产配置可能具有内部防火墙,这些防火墙阻止所有WFE以这种方式访问​​共享文件-部署前检查。当然,如果您希望在此区域进行更改,则可以在那里修改代码。

  4. 修订功能,以防止在功能激活时进行web.config修改

    当我尝试在企业项目中实现Config Store时,另一件事是Feature事件接收器,该事件将所需的appSettings密钥添加到web.config。这里的想法是,为了帮助简化安装和初始设置,必需的web.config条目添加了空值,因此开发人员要做的就是为他/她的网站插入适当的值。听起来很棒-它适用于单个网站集网站。但是对于多个网站集,当我们在第二,第三,第n个网站集中激活功能时,接收器当然会运行并将空条目添加到web.config 再次,尽管我们已经在第一次激活时插入了实际值。而且,由于新值会在文件中稍后出现,因此您猜猜使用了哪些值?

    因此,在此版本中,有一个Feature属性,该属性确定是否对web.config进行了修改-默认情况下将其设置为“ False”,但如果您希望对其进行更改,则该属性存在。

  5. “配置值”列现在更大

    以前,此列是“单行文本”,但现在是“注释”。这意味着您可以愉快地存储HTML / XML片段或其他较大的值,这在某些情况下非常有用。但是,请注意,如果您已经在站点上使用Config Store并想要“升级”,则此架构更改将非常重要-我将在readme.txt文件中进行讨论。

就是这样了。您可以从以下位置下载更新 www.codeplex.com/SPConfigStore -希望您发现它和我们一样有用。

15条评论:

匿名 said...

您可能对Tobias Lekman的SPListItemCacheDependency的实现感兴趣:
http://www.lekman.com/2008/12/cache-dependencies-in-sharepoint.html

克里斯·奥'Brien说过...

嗨,基思,

是的,我确实考虑过编写与Tobias完全相同的东西-主要是从Vince Tobias引用的作品中得出的。但是,让计时器作业每隔5或10秒轮询一次,这不得不实例化SPSite,然后获取一些SharePoint项目以检查其是否更改,我对此感到不舒服。另外,我认为Config Store的一项要求是更改生效 立即 -甚至要花10秒钟的时间,因为根据我的经验,总是会有管理员/开发人员不知道/忘记了缓存实施的延迟。

因此,使用.Net的CacheDependency感觉水平较低,并且不太可能导致性能下降。

有趣的对话。如果有人进行了一些适当的测试,将很有兴趣。

干杯,

克里斯。

匿名 said...

嘿克里斯,
很好!!!
我有一个问题,我们使用了较早版本的Config Store,并在几个自定义组件中引用了它,是否需要更改?即我们是否需要使用新版本的Config存储重新编译自定义组件/代码,还是只是升级Config存储WSP并确保其余所有工作正常?

感谢你的帮助..

谢谢
莫斯·巴迪

匿名 said...

克里斯,你好,喜欢这个项目。
快速提问。您会建议还是使用配置存储来检索数据库连接字符串?

克里斯·奥'Brien说过...

@MossBuddy,

好问题。我在readme.txt中概述了几个升级选项-建议下载并进行适当的阅读。简而言之,您可以:

-仅使用新组件,例如您关于用新版本重新编译项目的建议
-使用新程序集和新列表架构(较大的“配置值”字段)。这涉及更多,因为实际上不可能升级“就地”字段-readme.txt包含您需要执行的过程的更多详细信息

如有任何问题,请在Codeplex网站上的讨论区域中打上一行,我会答复。

HTH,

克里斯。

克里斯·奥'Brien说过...

@匿名,

安全显然是这里的关键考虑因素。一些要点:

-您的站点是仅在网络范围内可见的面向公众的站点还是Intranet?
-您的连接字符串是否使用集成安全性,或者它们指定了SQL用户名/密码?
-您已将哪些其他权限应用于SharePoint列表?

像许多与安全相关的事情一样,它确实取决于其他一些因素。它 威力 存储字符串的加密(例如单向)版本是完全可以接受的,但是请记住,如果具有适当权限的用户可以通过浏览器访问数据,而不是要求远程访问实际的数据,则该数据本质上是“更可用的”机。

HTH,

克里斯。

匿名 said...

谢谢克里斯。

使用列表的替代方法是web.config是存储连接字符串的首选选项?

匿名 said...

克里斯,你好
感谢这个很棒的项目。


当我们要创建新列表时,会出现Config存储库的列表模板,可以将其隐藏吗?

干杯
阿杰

匿名 said...

嗨,克里斯,在最新的readme.txt中,它说要添加web.config设置ConfigStoreSiteUrl,ConfigStoreWebName,ConfigStoreListName。它们应该是ConfigSiteUrl,ConfigWebName,ConfigListName还是都需要?

克里斯·奥'Brien说过...

是的,如果您需要真正的安全性,最好的方法是:

-使用集成身份验证,以便您的连接字符串一开始就没有任何用户名/密码
-加密web.config的相应部分-这是 有关如何使用RSA加密的文档

HTH,

克里斯。

克里斯·奥'Brien说过...

@阿杰

为此,我认为您需要将elements.xml的ListTemplate元素上的“隐藏”属性设置为“真”,然后重新激活功能。

HTH,

克里斯。

克里斯·奥'Brien说过...

@djeeg,

发现得好。没错,它是ConfigSiteUrl,ConfigWebName,ConfigListName,所以它是自述文件中的错字。现在固定在Codeplex上。

抱歉造成混乱!

谢谢,

克里斯。

乔治·杜尔齐说过...

嘿克里斯,
安装解决方案并浏览到Confog Store列表后,任何ListItems的添加/编辑视图仅显示Config name(配置名称)字段,而不显示屏幕快照中显示的所有其他字段。

我验证了所有站点列等均已部署。

关于如何解决此问题的任何提示?

克里斯·奥'Brien说过...

嗨乔治,

对此感到非常抱歉-这是一个“错误”(我认为是功能XML的某个地方),另一位用户今天才向我报告了此错误。字段在那里并且可以存储数据,这只是内容类型的某种破坏,这意味着表单不会显示所有字段。

我自己看过它,但是我和我的团队认为这是因为我们从1.0.0.0版本迁移到了 中间 我们的项目和我们的架构不是很干净。 (原因与“配置值”字段从“单行文本”更改为“注释”有关)。

不幸的是,我们没有解决根本问题,但是我们写了几行代码“修复”了问题,并使一切重新工作。但是,如果您使用Content Deployment(例如,我的 向导工具)以部署列表-发生这种情况时,我们只是在该环境上运行我们的方法以再次“修复”- 运行命令时没有数据丢失,这样做很不方便。

如果您通过电子邮件给我留下另一条评论(我不会发布),我会将代码转发给您。其他受影响的人也是如此。

不便之处,敬请原谅。下周我的会议讨论一结束,我的首要任务是解决这个问题。如果在此期间有人发现问题,我欠您啤酒!

让我知道您是否需要修正代码。

干杯,

克里斯。

克里斯·奥'Brien说过...

所有,

前几条评论中提到的问题已在 现在可在Codeplex网站上获得2.1.0.0版.

干杯,

克里斯。