RSS

Monthly Archives: 三月 2010

在SharePoint 2010系统中安装RBS FILESTREAM Provider

这两天在研究怎么写一个RBS Provider,可惜文档实在是很缺乏,基本上除了一篇Spec之外,就只有SQL产品组写的一个sample了。之后如果研究有结果,再整理成文章吧,现在先讲讲怎么直接安装并使用RBS FILESTREAM Provider。

————– 胡言乱语与正文的分隔线 ——————–

如果使用SharePoint 2007作为文档管理平台,它很让人诟病的一点就是,SharePoint 2007将文件本身直接存储在SQL Server数据库之中。虽然Windows SharePoint Services 3.0 SP1增加了一个External BLOB Storage(EBS)接口,但是微软并没有提供实现,而是需要开发人员自己来实现它。

SharePoint 2010仍然对EBS提供兼容,但并不推荐使用EBS,推荐的解决方案,乃是使用SQL Server 2008 Remote BLOB Storage(RBS)。

SQL RBS是一组API,通过RBS,一个SQL Server 2008数据库就不再需要将大二进制数据(BLOB)存储在数据库内部,而是可以存储到外面的某个地方,在数据库里面可能只会存储一个对外部BLOB数据的引用。SQL Server 2008和SQL Server 2008 R2都支持RBS。

听起来RBS实在是一个很好的东东。但是(总是有但是),RBS仅仅是一组API,换句话说,RBS可以让开发人员利用这组API,开发出一个RBS Provider,真正实现对BLOB数据的存取。如果没有RBS Provider,RBS自己可不会自动的将BLOB存储到某个指定的地方去。不同的RBS Provider,可以让我们将BLOB存储到文件系统、磁盘存储设备、文件服务器等等各种地方,反正不继续放到SQL Server数据库里面就对了。

image

在你对RBS有了初步认识之后,我们接着介绍SQL Server 2008里面的另外一个新特性:FILESTREAM。下面这句话摘自SQL Server 2008联机丛书:“通过将 varbinary(max) 二进制大型对象 (BLOB) 数据以文件形式存储在文件系统上,FILESTREAM 使 SQL Server 数据库引擎和 NTFS 文件系统成为了一个整体。”所以,FILESTREAM可以让管理员选择将SQL Server数据库里面的varbinary(max)类型BLOB数据,存储到本地NTFS文件系统上。在通过FILESTREAM对BLOB数据进行存取的时候,还能顺便能够享受到数据库事务处理的好处。

听起来,FILESTREAM和RBS很相似,是不是?但其实,RBS和FILESTREAM是两个不同的东东,它们互不依赖。RBS是一组API接口,通过这组API,应用程序就能将BLOB数据存储到数据库之外的某个地方,具体实现由开发人员创建的RBS Provider来完成。FILESTREAM是SQL Server 2008内置的一个特性,它能将原本存储在数据库里面的BLOB数据,存储到服务器本地的NTFS文件系统上。

SharePoint 2010所利用的,是RBS API,而并非FILESTREAM特性。所以,如果没有一个RBS Provider,我们并不能马上就将SharePoint 2010里面存储的文件,存储到数据库之外的某个地方去。但是,既然FILESTREAM特性已经拥有了现成的将数据库中的BLOB数据存储到NTFS文件系统上的能力,为什么不能直接使用FILESTREAM,做一个RBS FILESTREAM Provider,也就是利用FILESTREAM的功能实现的一个RBS Provider呢?这样,岂不是就能将SharePoint 2010中的文件,都存储到NTFS文件系统上了吗?

微软也想到了,所以,微软以特性包(Feature Pack)的形式,提供了一个RBS FILESTREAM Provider。你可以从这里下载x64版本的RBS FILESTREAM Provider。但是要在SharePoint 2010系统上安装并使用它,也是需要按照一定的步骤来操作的。下面就是具体的操作步骤。

1、确定SQL Server 2008已经启用了FILESTREAM

在安装SQL Server 2008时,会有一个步骤提示是否安装FILESTREAM。如果你不确定是否安装了此特性,从SQL Server 2008服务器上打开SQL Server配置管理器,从左边选中”SQL Server 服务”,然后从右边的窗格中用鼠标右键点击运行的SQL Server实例,选择”属性”菜单项。

image

在打开的属性窗口中,选择”FILESTREAM”选项卡,然后选中启用FILESTREAM的选择框,点击”确定”按钮。

image

打开SQL Server Management Studio,选中左侧的SQL Server实例,然后点击工具栏区域的”新建查询”,打开一个查询界面,然后在里面输入下面的SQL语句并执行。

EXEC sp_configure filestream_access_level, 2
RECONFIGURE

image

2、确定要应用RBS FILESTREAM Provider的内容数据库

由于RBS是基于数据库为单元来启用的,所以你可以选择在哪些SharePoint内容数据库上启用RBS。这意味着,对于SharePoint服务器场里面那些存储文件数量并不多的内容数据库,可能并没有必要为它启用RBS,而那些可能会存储大量文件的内容数据库,则可以启用RBS,有效的优化它们。

SharePoint 2010系统中,内容数据库与网站的关系是:

● 一个Web应用程序可以使用一个或多个内容数据库;
● 在新建Web应用程序时,会为其自动创建一个内容数据库,管理员可以稍后为此Web应用程序创建更多的内容数据库;
● 在Web应用程序中创建一个网站集时,这个网站集会被存储到Web应用程序的某个内容数据库中;
● 一个网站集(包括其所包含的首要网站和所有子网站),只能被存储在一个内容数据库中,而不能被分拆存储到多个内容数据库中。

管理员可以打开SharePoint 2010管理中心的内容数据库管理界面,查看每个Web应用程序所使用的内容数据库,或是为某个Web应用程序添加新的内容数据库。

image

在下面的示范操作中,我们就为上图中所示的这个名为”WSS_Content”的内容数据库,启用RBS。

3、配置内容数据库

在确定了要启用RBS的内容数据库之后,打开SQL Server 2008 Management Studio,找到这个内容数据库,用鼠标右键点击并选择”新建查询”菜单项。

image

在打开的查询窗口中,输入下面这些SQL语句并执行。

use [WSS_Content]
if not exists (select * from sys.symmetric_keys where name =
N’##MS_DatabaseMasterKey##’) create master key encryption by password =
N’Admin Key Password !2#4′

use [WSS_Content]
if not exists (select groupname from sysfilegroups where
groupname=N’RBSFilestreamProvider’) alter database [WSS_Content]
add filegroup RBSFilestreamProvider contains filestream

use [WSS_Content]
alter database [WSS_Content] add file (name = RBSFilestreamFile,
filename = ‘c:blobstore‘) to filegroup RBSFilestreamProvider

在上面这些SQL指令中,标记为绿色的,是你在复制了这些指令后,需要按照你的环境中的实际情况,需要修改的部分。”WSS_Content“需要修改为你要启用RBS的内容数据库的实际名称。”c:blobstore“要修改成你希望用来存放BLOB文件的文件夹路径。从实践角度出发,你需要选择一个位于非系统分区、剩余空间大、速度快、稳定可靠的文件夹。注意,这个文件夹只能是一个本地路径,而不能是网络路径,因为FILESTREAM不支持远程NTFS文件夹。另外,这个文件夹也不要事先建立好,上面的SQL指令会自动帮你将这个文件夹创建出来。

image

上述SQL语句执行完毕之后,可以打开资源管理器,确认在SQL Server服务器上,相应的文件夹已经创建成功。

4、安装RBS FILESTREAM Provider

下载到的RBS_x64.msi文件复制到SharePoint服务器场中的每一台服务器上,所有的SQL Server数据库服务器和SharePoint服务器上都必须安装此RBS Provider。

先在SQL Server数据库上和SharePoint服务器上(如果服务器场中有多台SharePoint服务器,则在一台Web前端服务器上),安装RBS FILESTREAM Provider,安装步骤如下。

以管理员身份运行命令提示符。

image

在命令提示符窗口中,使用”cd”指令将当前路径设置为”RBS_x64.msi”所在的文件夹,然后输入下面这行指令并执行:

msiexec /qn /lvx* rbs_install_log.txt /i RBS_X64.msi TRUSTSERVERCERTIFICATE=true FILEGROUP=PRIMARY DBNAME=”WSS_Content” DBINSTANCE=”sp2010” FILESTREAMFILEGROUP=RBSFilestreamProvider FILESTREAMSTORENAME=FilestreamProvider_1

上面指令中用绿色标注的部分,是需要按照你的环境中的实际情况进行修改的部分。”WSS_Content“需要修改为需要启用RBS的内容数据库,”sp2010“需要修改为实际的SQL Server 2008实例名称(如果在安装SQL Server 2008时,你没有使用默认实例名称,那么它的值可能类似”sp2010express”这样的格式)。对每个内容数据库,都只应该使用msiexec.exe执行一次这条指令。

image

在你敲入了上面这行很长的指令并敲下回车之后,命令提示符窗口看起来会立即执行完成,但实际上,后台会继续执行RBS Provider的安装程序。你可以打开Windows任务管理器,应该会看到有好几个msiexec.exe进程在执行中。过上一会儿,任务管理器中就不会再显示有几个msiexec.exe在运行(在我的环境中仍会剩下一个另外的msiexec.exe进程),这表明RBS Provider安装过程已经完成。

image

在RBS Provider安装过程中,它会将log信息写入与”RBS_x64.msi”安装文件同目录的”rbs_install_log.exe”文件。从资源管理器中打开这个log文件,搜索其中是否有如下”Installation completed successfully”之类的信息,这些信息表示”RBS_x64.msi”的安装是成功的。

image

如果在你的SharePoint服务器场中,只有一台SharePoint服务器,那么按照上面的描述,在它上面安装完RBS FILESTRREAM Provider就完事了。但是如果服务器场中存在多台SharePoint服务器,那么就需要继续在其他的Web前端服务器和应用服务器上,安装RBS FILESTREAM Provider,不过,命令提示符里面的指令需要换成:

msiexec /qn /lvx* rbs_install_log.txt /i RBS_X64.msi DBNAME=”WSS_Content” DBINSTANCE=”sp2010” ADDLOCAL=”Client,Docs,Maintainer,ServerScript,FilestreamClient,FilestreamServer”

在RBS FILESTREAM Provider安装到所有服务器上之后,打开SQL Server 2008 Management Studio,刷新内容数据库的Table列表,应该会看到多出来许多名称以”mssqlrbs”开头的,与RBS有关的Table。如果在查询窗口中执行下面的SQL语句,也应该能查询出一些结果。

select * from dbo.sysobjects where name like ‘rbs%’

image

如果在内容数据库中并没有上面这些Table,运行上面的SQL语句也查询不出任何结果,那么表明RBS Provider并没有正确安装到内容数据库上。如果真是这样,在每台服务器上,打开资源管理器,双击”RBS_x64.msi”,然后在出现的安装界面中,使用”卸载”选项先将RBS Provider卸载掉,然后再按照上面的步骤,重新在命令提示符窗口中尝试安装它。

5、为内容数据库启用RBS FILESTREAM Provider

终于到了最后一个步骤。在SharePoint服务器上,打开SharePoint 2010 Management Shell,这是一个基于Windows Powershell的命令行管理工具。

image

在SharePoint 2010 Management Shell中,依次执行下面的指令:

(1) $cdb = Get-SPContentDatabase “WSS_Content
获取到指定的内容数据库(SPContentDatabase)对象实例,绿色所标注的”WSS_Content“需要更换成在你的环境中,实际的内容数据库名称。

(2) $rbss = $cdb.RemoteBlobStorageSettings
获取内容数据库的RBS设置(SPRemoteBlobStorageSettings)对象实例。

(3) $rbss.Installed()
检查在内容数据库上是否安装了RBS,如果需要,更新相应的属性值。

(4) $rbss.Enable()
在内容数据库上启用RBS。

(5) $pvdName = $rbss.GetProviderNames()[0]
获取第一个注册到内容数据库上的RBS Provider的名称。

(6) $rbss.SetActiveProviderName($pvdName)
为内容数据库设置要激活的RBS Provider。

image

然后,你可以执行”$rbss”来查看它的一些属性值,如果设置正确,它输出的内容应该如上图所示。

如果你启用RBS FILESTREAM Provider的内容数据库中,已经存储了一个网站集,那么在你启用了RBS Provider之后,网站集里面的文档,并不会自动的马上通过FILESTREAM,转存到NTFS文件系统上。只有新增的文档才会被存储到NTFS文件系统上,网站集里面之前上载的文档,仍然会保存在内容数据库里面。如果你希望现在将那些旧的文档,统统转存到我们所指定的NTFS文件系统中,那么可以继续在SharePoint 2010 Management Shell中执行下面这个指令:

(7) $rbss.Migrate()

如果你希望设置一个文档大小阈值,只有大小超过此阈值的文档,才通过RBS FILESTREAM Provider存储到NTFS文件系统上,而小于此阈值的文档,仍然存储在内容数据库中,那么可以在SharePoint 2010 Management Shell中继续执行下面的指令(假设阈值是1048000字节,也就是1M):

(8) $rbss.MinimumBlobStorageSize = 1048000
(9) $rbss.Update()

上面的这些指令,都是针对一个内容数据库的。如果你有多个内容数据库要启用RBS,那么就对每个内容数据库都执行一遍上述指令。

6、检查最终效果

在完成了上述所有操作步骤之后,在SharePoint网站中上载一些文档,然后检查你所设定的NTFS文件夹,里面应该会包含有一些子文件夹,存储着这些文档。

参考链接
Jie Li’s Geek World

Enjoy RBS !

 

Posted by on 2010/03/28 in 未分类

6 Comments

示范如何以异步AJAX方式访问SharePoint数据

很多人都希望在SharePoint页面上能让某个部分能"局部刷新",也就是说,这个部分的内容在刷新的时候,不会造成整个页面的Postback。为了快速演示大致的实现方法,在周末的时候做了一个用来示范的项目,它实现的功能很简单:

1、提供给用户一个下拉框,列出当前网站所有的文档库,用户可以选择一个文档库,并载入此文档库的文件夹架构。
2、文件夹结构通过一个TreeView来进行展现。
3、当用户在TreeView上点击一个文件夹节点时,将文件夹所包含的文件显示在一个Grid Table中。
4、在Grid Table中,包括了分页、排序、搜索等功能。
5、上面的所有从SharePoint系统中载入数据的操作,都不会引发页面刷新,而是通过异步AJAX方式从SharePoint系统中获取所需的数据。载入数据的过程中,用户的页面操作不会被打断。

这个示范的实现思路大致如下:

1、为了能让SharePoint系统对外发布所需的数据,需要在服务器上创建几个定制的接口。虽然SharePoint内置了Web Services接口,但其中不一定会包含我们所需的接口方法。在这个示范中,为了简单起见,我直接创建了几个.ashx Http Handler,客户端的代码可以通过直接访问这几个.ashx文件,来调用服务器端的接口。

2、这几个.ashx文件会以JSON格式纯文本方式,将客户端请求的数据返回。选择JSON格式的理由是,它足够简单且通用,在这里示范的场景中,其表现力足够用了。另外一个选择JSON的理由是,我打算在页面上使用jQuery来调用服务器端的接口,而jQuery对JSON格式的数据有很好的处理能力。

3、客户端页面上的展现,没有创建自定义Web Part,而是用HTML + JS的方式,来访问服务器端的服务接口,获取到所需数据,并将界面呈现给用户。简单来说,就是AJAX啦。我选择使用jQuery,并利用了jQuery异步AJAX的能力,实现异步请求、无刷新、不阻塞用户页面操作的效果。

4、为了方便快速的实现TreeView、Grid Table、Dialog等界面效果,我直接找了三个jQuery插件:TreeViewDataTablesFancyBox

为了帮助大家更容易了解这些思路,我录了一个简短的视频。

下载WMV格式视频
下载示范项目源码

在SharePoint 2010中,其内置提供的Client OM包含了ECMAScript(JavaScript)类库,这样开发人员可以直接使用这些类库,通过页面脚本的方式访问SharePoint 2010网站数据。

Enjoy SharePoint !

 

Posted by on 2010/03/20 in 未分类

3 Comments

SharePoint 2010新体验10 – 文档评分

最近51CTO的朋友帮我在51CTO上也开通了一个镜像blog,地址是kaneboy.blog.51cto.com,两边的内容一样,如果您喜欢51cto的风格,可以从那边阅读我的blog内容。我正寻思这写一个小程序,让它能自动同步我的blog内容…

另外,这几周都没有往blog上写什么内容,主要原因是正在忙着和杜伟一起写《SharePoint 2010应用程序开发指南》。写书通常是一个很难得到众多反馈的过程,因为毕竟有出版社和版权的限制,所以在作者写书的过程中,难免自己都怀疑写的内容是否合读者的胃口。所以如果可能,我希望在征得出版社同意之后,能够在blog上将其中某些(也没法是太多)已经写完的章节发布出来。这样大家可以先预览一下,给内容也提一点建议。

———- 东扯西扯与正文的分割线 ———–

如果大家使用SharePoint来构建文档管理解决方案,给文档评分其实是一个挺常见的需求。可惜在之前的版本中,SharePoint并没有内置这个功能,当然,也不断的有社区项目,通过自定义开发的方式,给SharePoint文档库添加上这个功能。SharePoint 2010终于给文档库(实际上是所有列表),都加上了给文档(和列表项)评分的功能。

在文档库设置中,打开“等级设置”页面,然后在页面中启用等级评定。
image

然后文档库中会增加两个网站栏,“等级(0-5)”和“等级数”。前者用来存储所有用户给这个文档评分的平均值,后者用来存储有多少用户给文档评过分了。
image 

这样,在文档库的视图中,就能看到如下的界面。用户通过在“等级(0-5)”字段上滑动鼠标,就能给指定的文档打一个分数。
image 

在用户给文档评分之后,这个值并不会马上被汇总(并计算平均值)。SharePoint 2010通过后台一个名为“User Profile Service Application – 社会评分联合工作”的计时器作业,定时对评分值进行汇总计算,这个计时器作业默认是每小时运行一次。如果你希望它能更频繁的运行,可以在SharePoint 2010管理中心的“监控 – 计时器作业 – 复查作业定义”中找到这个计时器作业,修改它的定期计划,或者干脆直接点击“立即运行”按钮,来使它马上执行。
image 

在评分值被汇总计算之后,用户就能看到如下图所示的汇总结果了。image

 

Posted by on 2010/03/15 in 未分类

2 Comments