Kaneboy's SharePoint Blog

SharePoint & Office Zealot
随笔 - 401, 评论 - 8114, 引用 - 201

导航

关于


About me :
SharePoint Architect. Build SharePoint solutions from year of 2003. Joined Microsoft in 2004. Working for HP now.

Certification :
PRO - SharePoint Dev 2010
TS - SharePoint 2010 App Dev
PRO - SharePoint 2010 Admin
TS - SharePoint 2010 Config
MCPD - Web Dev
MCTS - SharePoint 2007 Dev
MCTS - SharePoint 2007 Config
MCTS - WSS 3.0 Dev
MCTS - WSS 3.0 Config
MCTS - SPS2003 Infra
MCTS - SPS2003 App
MCT
MVP 

Contact me :
kaneboy@gmail.com | follow @kaneboy on twitter



Authored books:


标签

每月存档

最新留言

广告

【第1页/共12页,401条】
首页
前页
1
...
2010年08月16日

是的,是的,我知道Visual Studio 2010已经提供了“可视化Web部件”模板,所以在2010版本中,确实没有理由再使用QuickPart之类的工具了(虽然QuickPart仍然支持几个VS2010可视化Web部件模板仍然不支持的功能,例如可以直接在用户控件上实现自定义属性和Web Part Connection)。但是,有很多正在使用QuickPart的SharePoint Server 2007的网站,在升级到SharePoint 2010版本后,仍然希望页面上的QuickPart能正常继续工作。

如果在使用QuickPart的时候,你是将.ascx文件都放到了每个Web应用程序的wpresources文件夹中,那么实际上当你升级到2010之后,QuickPart仍然会继续正常工作。嗯,如果确实是这样,这说明你的人品那是相当的好。恭喜,你不用再继续往下看,关掉这个窗口,看点其他好玩的东东吧。

如果你遇到了问题,比如你是将.ascx文件放在12\template\controltemplates目录中(实际上这是推荐的做法,老赵写过一篇不错的文章讲述了为什么以及如何将.ascx文件放到这个目录中),那么很可能会发现QuickPart的用户控件选择框中变得空空如也。这时,你可以从http://quickpart.codeplex.com/releases/view/50664下载这个2.0.0版本和它的源代码,然后将其安装到SharePoint 2010系统上。

以下是关于这个更新版本的一些说明:

1、这个进行了一些修正的2.0.0版本仅仅针对SharePoint 2010,它也只能工作在SharePoint 2010系统中。不要尝试在SharePoint 2007系统上安装它。
2、2.0.0版本程序集文件(QuickPart.dll)的强名称保持了与1.03版本的一致,这有利于你通过其他手段(例如直接更新GAC中的程序集)来进行升级。
3、项目源代码使用了Visual Studio 2010中的SharePoint项目模板。
4、在创建这个升级版本时,我基本上只是将项目升级到了VS 2010,然后修正了一些与SharePoint 2010一起工作时的问题,所以你有可能会发现其他问题。如果真的发现了问题,我建议:(1) 使用源代码进行调试;(2) 把问题告诉我。

posted on 2010-08-16 22:44:52 by kaneboy  评论(0) 阅读(4751)

 
2010年08月12日

当程序员使用Visual Studio 2010为SharePoint 2010创建应用程序时,可以创建两种类型的解决方案,服务器场解决方案和沙盒解决方案。比如,打开Visual Studio 2010,新建一个空白SharePoint项目,你看到的第一个界面就是如下这个对话框。

image

服务器场解决方案(或简称为场解决方案)和SharePoint 2007一样,是一种被完全信任的解决方案。场解决方案可以包含能放到解决方案包里面的所有SharePoint组件和元素,比如应用程序页、可视化Web部件等等。在SharePoint 2010系统上安装场解决方案包,需要系统管理员在SharePoint服务器上,打开命令提示符窗口或PowerShell窗口,输入相应的命令行指令或Cmdlet,将这个场解决方案包安装到SharePoint服务器场里面。

如果你的客户对SharePoint系统有严格的管控流程,那你就惨了。你辛辛苦苦的把代码里面的Bug全部修正之后,把项目打包成更新的解决方案包,然后,身为开发人员的你必须填写N张表格,接着就只能眼巴巴的等着管理服务器场的IT人员帮你把这个更新的解决方案包部署到服务器场里面,因为只有他们才有权限能在服务器上直接操作。如果客户每次还需要你去解释,到底每次更新都做了些什么,对服务器有何影响,那你就更加会头大了。

于是SharePoint 2010引入了沙盒解决方案的概念。说到“沙盒”,嗯,这可是好东东啊。这些年整个开发平台都在围着“沙盒”转,JVM就是一个“沙盒”,CLR也是一个“沙盒”。有了“沙盒”,就能将自定义代码限制在其中,即使它一不小心crash掉,也能最小化带来的影响。

SharePoint沙盒解决方案的作用也差不多。如果开发人员将自己的SharePoint 2010项目创建为沙盒解决方案,那么SharePoint 2010会在一个特定的“沙盒”中运行沙盒解决方案,并随时监控“沙盒”里面代码的运行情况。

对于场解决方案里面所包含的代码,除了少数组件外,其他大部分组件,例如Web部件、页面、事件处理程序之类的,都是被载入到w3wp.exe进程中运行。这个是理所当然的,因为SharePoint就是一个ASP.NET Web应用嘛,所以各种自定义代码自然会被ASP.NET Runtime给载入到w3wp.exe进程中。

但是如果是沙盒解决方案,其中所包含的代码将运行在一个单独的进程中(准确的说,有好几个进程都被用于运行沙盒解决方案里面的代码),而并非w3wp.exe进程。

例如,开发人员将一个自定义Web部件打包到一个沙盒解决方案包,部署到一个网站集并激活,然后将这个Web部件给放置到某个页面上。当有用户访问这个页面时,w3wp.exe就会发现,需要运行那个Web部件中所包含的自定义代码,这时,w3wp.exe进程会联系(本地或远程服务器上的)SPUCHostService.exe进程,告诉它需要以“沙盒”模型执行一些代码。SPUCHostService.exe进程会通知SPUCWorkerProcess.exe进程载入需要运行的代码,SPUCWorkerProcess.exe进程会通过SPUCWorkerProcessProxy.exe来完成对SharePoint对象模型的调用,并执行那个Web部件中的自定义代码。这些代码执行完成之后,会将执行结果最终返回到w3wp.exe进程,w3wp.exe拿到这个自定义Web部件的执行结果,就可以继续将页面执行下去了。

要想SharePoint 2010服务器场能执行沙盒解决方案,就需要在至少一台服务器上启动“Microsoft SharePoint Foundation沙盒代码服务”。从SharePoint 2010管理中心打开“服务器上的服务”页面,就可以将这个服务在指定的物理服务器上启动或停止。

image

如果你的服务器场包含了n台服务器,那么你既可以在所有物理服务器上启动“Microsoft SharePoint Foundation沙盒代码服务”,也可以只选择在某几台应用服务器上启动“Microsoft SharePoint Foundation沙盒代码服务”。甚至最极端的,你可以准备一台CPU和内存都很强大的服务器,加入到服务器场中,然后专门在这台服务器上运行“Microsoft SharePoint Foundation沙盒代码服务”。这样,无论服务器场中的哪一台前端服务器需要运行沙盒解决方案中的自定义代码,这些请求都会被发送到这台强大的物理服务器。万一沙盒解决方案里面的自定义代码很烂,会严重影响运行代码的服务器的CPU或内存资源,那么也只会影响到这一台特定的服务器。

当w3wp.exe进程需要找到一个地方运行沙盒代码时,它会基于某种预先制定的策略。SharePoint 2010有两种策略可用:1、总是在得到请求的同一台服务器上运行沙盒代码;2、使用一种内置的优化规则来传递执行请求。第1种策略非常简单,w3wp.exe总是会将执行沙盒代码的请求传递给自己这台服务器上的SPUCWorkerProcess.exe进程,也就是由当前服务器负责运行沙盒代码。第2种策略类似于一种“负载平衡”机制,SharePoint会检查服务器场中哪些服务器可以用来运行沙盒代码,然后按照一个优化规则,让w3wp.exe将执行代码的请求传递到某台服务器。这个优化规则简单来说就是,如果上次是服务器A执行了某个沙盒解决方案里面的一个Web部件代码,那下次会优先考虑继续让服务器A执行同一个Web部件里面的代码。

具体选择哪个策略,可以在SharePoint 2010管理中心打开“系统设置 - 管理用户解决方案”页面,然后就能选择2个策略中的某一个了。

image

沙盒解决方案中包含的代码除了会在单独的进程中运行之外,它还有很多的限制。首先,SharePoint 2010使用了CAS(Code Access Security)来限制了沙盒代码能做的事情。在“Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\CONFIG\wss_usercode.config”文件中定义了沙盒代码的CAS策略,沙盒代码的权限被这个CAS策略限制为:

●SecurityPermission.Execution:可以执行托管代码;
●AspNetHostingPermission = Minimal:可以在ASP.NET中运行,但不能访问服务器上的任何资源;
●SharePointPermission.ObjectModel:可以使用SharePoint对象模型。

由于CAS的限制,沙盒代码能够做的事情是很有限的,比如,它不能访问服务器上的任何文件,也不能访问数据库。除了这些限制之外,对于SharePoint对象模型的调用,SharePoint系统对沙盒代码进行了进一步的限制。

虽然CAS中给予了沙盒代码“SharePointPermission.ObjectModel”权限,但沙盒代码在单独的进程中运行之前,它们都会被经过预先检查,凡是不运行调用的对象模型出现在了代码中,就会直接抛出异常,中止代码运行。禁止在沙盒代码中使用的对象模型包括:

●SPSite的构造函数
●SPSecurity类
●Microsoft.SharePoint.Navigation命名空间下的所有类
●除了SPUtility.SendEmail()和SPUtility.GetNTFullNameandEmailFromLogin()之外的所有SPUtility所提供的方法
●其他...

在SharePoint 2010 SDK中有一个列表,列出了所有允许在沙盒解决方案中被使用的SharePoint对象模型,请参考:http://msdn.microsoft.com/en-us/library/ee537860.aspx

除了对代码的限制之外,对于能被包含在沙盒解决方案中的SharePoint元素,也有一些限制,下面这些元素都不能被包含在沙盒解决方案中:

●Web应用程序和服务器场级别的Feature
●代码工作流
●内容类型绑定
●<HideCustomAction>元素
●Custom Action group
●应用程序页
●可视化Web部件

SharePoint 2010会严格监控沙盒解决方案中的代码的运行状况。为了限制沙盒代码所占用的服务器资源,SharePoint 2010为每个网站集分配了一定的“点数”,随着沙盒代码的运行,这些“点数”会被逐渐消耗,如果一个网站集所分配的“点数”被消耗完了,那么这个网站集里面所有的沙盒解决方案将暂时不可用,直到第二天“点数”被自动重置为预设置为止。

管理员可以在SharePoint 2010管理中心的“应用程序管理 - 配置配额和锁定”页面为每个网站集指定其可用的“点数”配额。默认每个网站集每天可以消耗的“点数”配额是300。

 image

那么SharePoint 2010是如何计算“点数”的呢?SharePoint 2010内置了一套计算规则,如果希望了解这些规则,可以打开服务器上的SharePoint 2010 Management Shell,然后输入一个Cmdlet指令:

[Microsoft.SharePoint.Administration.SPUserCodeService]::Local.ResourceMeasures | ft Name,ResourcesPerPoint,AbsoluteLimit

image  

上图所示的就是SharePoint 2010内置的“点数”计算规则。比如,“UnhandledExceptionCount 50 3”表示:每50个未捕获异常将消耗1个“点数”,而每天如果某个解决方案包由于未捕获异常的原因消耗了3个“点数”(也就是它发生了150次异常未捕获的情况),那么这个解决方案包将被直接中止运行,即使网站集当前还有剩余“点数”。

说了沙盒解决方案这么多的限制,那么为什么开发人员要使用沙盒解决方案呢?沙盒解决方案最大的好处,就是它的部署和管理不需要服务器场管理员的参与。网站集管理员可以打开“网站设置 - 解决方案”页面,就能直接上载沙盒解决方案,并对它们进行激活、停用等操作。

image

由于网站集管理员就可以直接通过Web界面来部署和管理沙盒解决方案,从此网站集管理员(或开发人员)就不用每次求爷爷告奶奶的等着服务器场管理员进行解决方案部署了。当然,这是一种妥协,服务器场管理员利用SharePoint 2010系统对沙盒解决方案的种种限制、监控,来保证了沙盒解决方案能始终在一个安全的“沙盒”环境中运行,即使沙盒代码写得很糟糕,它也会能把前端服务器搞死。有了这些保证,服务器场管理员也就能放心的让网站集管理员自己开发、部署沙盒解决方案了。

(以上内容节选自正在撰写中的《SharePoint 2010应用程序开发指南》,略有修改。)

posted on 2010-08-12 01:47:03 by kaneboy  评论(0) 阅读(5260)

 
2010年06月18日

第二章详细介绍了Visual Studio 2010中内置的SharePoint Developer Tools。发现任何问题,请告诉我(kaneboy [a] gmail.com)。

第二章 使用Visual Studio 2010    2
第一节 建立开发环境    2
2.1.1 建立开发环境的可选方案    3
2.1.2 在Windows 7 x64操作系统中安装SharePoint 2010    6
第二节 SharePoint 2010项目模板与项模板    28
2.2.1 项目模板    28
2.2.2 项模板    35
2.2.3 可替换Token    40
第三节 使用Visual Studio 2010中的SharePoint开发人员工具    42
2.3.1 SharePoint网站连接器    43
2.3.2 SharePoint 2010项目结构    47
2.3.2 Feature设计器与解决方案包设计器    73
第四节 导入解决方案包    87
第五节 总结    106


点击“full”按钮可以全屏阅读。

posted on 2010-06-18 17:59:32 by kaneboy  评论(0) 阅读(14276)

 

在SharePoint 2010中,如果一个子网站是继承其父网站的权限,那么从网站设置中打开网站权限页面,你会看到:
image

点击Ribbon区域的“停止继承权限”,管理员就可以断掉当前网站与父网站的权限继承,自定义网站的权限设置:
image

但是,如果你还想在网站中创建自定义的权限级别,当点击Ribbon区域的“权限级别”按钮后,你可能会看到:
image 

在上面的截图中,显示网站的权限级别继承自父网站,你不能创建自定义的权限级别。没错,虽然网站的权限设置已经从父网站断开了,但是权限级别仍然有可能继承自父网站。如果你希望在子网站中能创建和管理自定义权限级别,那么...

从“开始”菜单中打开“SharePoint 2010 Management Shell”,然后输入如下这些指令:
image

然后刷新一下页面,就能够修改网站的权限级别啦:
image 

参考:
SPRoleDefinitionCollection.BreakInheritance Method

posted on 2010-06-18 17:08:35 by kaneboy  评论(0) 阅读(13552)

 
2010年06月07日

关于《SharePoint 2010应用程序开发指南》,我和杜伟同学正在撰写中,希望下半年早点写完。通常书正式出版的时候,出版社都会挑选2、3章,将电子版开放出来以供预览,我想了一下,与其等到定稿后、出版前才提供预览,不如早点将一些节选的章节开放出来,让大家"一起来找茬"…

 

大家在阅读的过程中,发现内容有任何的问题,都可以给我发邮件(kaneboy [at] gmail.com)告诉我。这次发布的是第二章《使用Visual Studio 2010》的第一节《建立开发环境》。第二章的完整目录如下。

 

第二章 使用Visual Studio 2010    2

第一节 建立开发环境    2

2.1.1 建立开发环境的可选方案    3

2.1.2 在Windows 7 x64操作系统中安装SharePoint 2010    6

第二节 SharePoint 2010项目模板与项模板    27

2.2.1 项目模板    28

2.2.2 项模板    35

第三节 使用Visual Studio 2010中的SharePoint开发人员工具    40

2.3.1 SharePoint网站连接器    40

2.3.2 SharePoint 2010项目结构    44

2.3.2 Feature设计器与解决方案包设计器    70

第四节 导入解决方案包    80

第五节 总结    100

 

第一节 建立开发环境

 

要开发SharePoint 2010应用程序,开发人员必须构建一个SharePoint 2010开发环境。开发SharePoint 2010应用程序有一个基本的需求,就是所有的开发工作几乎都需要依赖于SharePoint 2010系统,换句话说,开发环境中除了Visual Studio 2010之外,还必须直接安装有SharePoint 2010。在本地安装一个Visual Studio 2010,然后使用远程服务器上的一个SharePoint 2010系统,这种方式是不受支持的。

 

另外需要注意的是,只有Visual Studio 2010专业版以上的版本,才内置了SharePoint 2010开发人员工具,并且SharePoint 2010项目模板只有C#和Visual Basic.Net这两个语言版本。

 

2.1.1 建立开发环境的可选方案

 

SharePoint 2010必须使用x64架构,在很多时候,这会给创建SharePoint 2010开发环境带来一些麻烦。但是相比之前的版本,SharePoint 2010除了能被安装到Windows Server 2008 x64和Windows Server 2008 R2 x64这两个服务器操作系统之外,它还能被安装到Windows Vista x64 SP1和Windows 7 x64客户端操作系统之上。所以开发人员可以有多种选择,来建立自己的SharePoint 2010开发环境。表格 2-1列出了开发人员可选的几个主要方法。

 

方法

说明

优点

缺点

运行在开发人员本地机器上的虚拟机

在开发人员的本地机器上使用虚拟机技术,在虚拟机中安装Windows Server 2008/2008 R2 x64、SharePoint 2010、Visual Studio 2010,构建出一个完整的开发环境。所有的开发工作都在这个虚拟机中进行。

如果开发人员本地机器的操作系统是Windows Server 2008/2008 R2 x64,那么可以选择使用操作系统内置的Hyper-V功能,来创建和使用虚拟机。

如果开发人员本地机器的操作系统是Vista SP1 x64或Windows 7 x64,那么可以选择使用其他第三方的虚拟机软件,例如VMware Workstation或Virtual Box。

  • 开发环境和SharePoint 2010的实际运行环境比较一致。
  • 虚拟机里面的开发环境非常独立,不会受到额外不相干的软件的干扰。
  • 开发团队可以创建一个标准的开发环境虚拟机,然后共享给每个开发人员使用。
  • 虚拟机很容易备份。同时常见的虚拟机软件都会包含分支和回滚功能,这样使得开发环境具有较大的灵活性。
  • 需要高性能的开发机器,特别是需要大量内存。如果希望虚拟机运行流畅,开发机器的内存最好不要低于8GB。
  • 绝大多数的虚拟机软件,都要求宿主虚拟机的开发机器上必须安装64位的操作系统。(有些虚拟机软件,例如VMware Workstation,支持在32位的宿主操作系统上运行64位的虚拟机。)
  • 开发机器的CPU必须支持Virtualization Technology、EMT64和Execute Disable Bit。

直接在本地机器上安装SharePoint 2010

开发人员可以在自己的本地开发机器上直接安装SharePoint 2010和Visual Studio 2010,然后把开发机器直接作为开发环境使用。

如果开发人员本地机器的操作系统是Windows Server 2008/2008 R2 x64,那么直接安装SharePoint 2010会比较简单,基本上和部署一个单服务器的SharePoint 2010没有什么区别。

如果开发人员本地机器的操作系统是Vista SP1 x64或Windows 7 x64,那么直接安装SharePoint 2010需要特别的操作,和常规的SharePoint 2010部署并不相同。

如果开发人员希望将开发环境和工作环境(用来收发邮件、存储和听MP3等等)分开,可以考虑使用多系统启动,将开发环境安装在一个独立的系统中。在多系统启动时,甚至可以考虑采用VHD Boot系数。

  • SharePoint 2010环境的运行速度比使用虚拟机技术要快。
  • 开发环境难以备份和移植。
  • 开发机器上的操作系统无论是Windows 2008/2008 R2,还是Vista或Windows 7,都必须是64位版本。
  • 开发环境容易受到日常工作环境中安装的众多软件的影响。
  • 即使在不做开发的时候,保持运行的SharePoint 2010后台服务也会影响到开发机器操作系统的性能。

使用专用的开发服务器

开发团队在专用的服务器上,使用虚拟机技术为每个开发人员创建独立SharePoint 2010开发环境。开发人员可以通过远程桌面的方式连接并使用开发环境。

  • 拥有虚拟机开发环境的各种好处。
  • 由于开发环境不位于开发人员的本地机器上,所以不需要本地机器具备太高的性能。
  • 开发环境的维护和管理,都可以集中在服务器端进行。
  • 开发团队需要有可用的服务器资源。
  • 由于服务器需要为每个开发人员提供独立的开发环境,这意味着服务器上可能需要同时运行多个虚拟机,这对服务器的性能有较高的要求。
  • 由于开发人员需要使用远程桌面连接到服务器上的开发环境,开发人员的效率可能会受到本地机器与服务器之间网络连接速度的影响。

表格 2-1:创建SharePoint 2010开发环境的可选方法列表

 

提示 有关VHD Boot的详细信息,请参考http://edge.technet.com/Media/Windows-7-Boot-from-VHD/

 

选择何种方式来建立开发环境,基本上取决于开发团队所拥有的资源。如果拥有比较好的硬件资源(比如开发机器拥有8GB的内存),那么推荐使用Hyper-V或其他第三方的虚拟机技术,在虚拟机中构建一个SharePoint 2010开发环境。虚拟机的好处是可以为开发团队创建一个标准、一致的开发环境,并且开发环境不会受到其他杂七杂八软件的干扰。如果开发人员的本地机器并没有那么"强劲",并且习惯使用Windows Vista x64 SP1或Windows 7 x64作为自己的主操作系统,那么可以选择直接将SharePoint 2010安装到本地机器的操作系统中。

 

提示 无论开发团队最终选择何种方式来为开发人员建立开发环境,但基本原则是每个开发人员都应该有独立的开发环境,而不能多个开发人员(甚至整个开发团队)共享一个开发环境。共享的开发环境通常会导致较低的开发效率。

 

2.1.2 Windows 7 x64操作系统中安装SharePoint 2010

 

使用虚拟机技术,或是直接将SharePoint 2010安装到Windows Server 2008/2008 R2 x64操作系统上,和部署一个单服务器SharePoint 2010系统区别不大,所以在本书中不再单独讲述。但由于直接将SharePoint 2010安装到Windows 7 x64操作系统中是SharePoint 2010的新特性,而且很多开发人员的本地机器上也是使用的此操作系统,所以我们将在本节介绍如何在Windows 7 x64操作系统中安装SharePoint 2010,以构建一个开发环境。我们相信对于很对开发人员而言,这算得上是一种经济且实用的方案。

 

对准备在Windows 7操作系统上安装SharePoint 2010的开发人员而言,一个好消息是,开发环境不一定需要加入到域中。无论你的开发机器是否已经加入了域,都没有关系。

 

在安装之前,建议将Windows 7内置的用户帐户控制(UAC)关闭。通过"控制面板 - 系统和安全 – 更改用户帐户控制设置",打开如图 2- 1所示的界面,然后将滑条滑动到最下面的一个选项。

 

2- 1:设置Windows 7中的UAC

 

提示 虽然SharePoint 2010也可以被安装到Vista SP1 x64操作系统中,但篇幅所限,所以本书仅介绍如何使用Windows 7 x64建立开发环境。如果你使用的是Vista SP1 x64,请参考SharePoint SDK中的相关章节:http://msdn.microsoft.com/en-us/library/ee554869.aspx

 

我们将要安装的SharePoint 2010开发环境具有如下特点:

  • 我们将直接在Windows 7系统中安装SQL Server 2008 R2,作为SharePoint 2010的数据库。
  • SharePoint 2010将以服务器场模式安装。

 

2.1.2.1 安装所需补丁与组件

 

首先,我们需要在Windows 7操作系统上安装SharePoint 2010所需要的各种补丁与组件。下面是所有必需补丁与组件的列表以及它们的下载地址,如果在下载页面上显示有多个平台版本(x86、x64、IA64),请确保下载并安装x64版本:

  • ADO.NET Data Services Update for .NET 3.5 SP1:http://www.microsoft.com/downloads/details.aspx?familyid=79d7f6f8-d6e9-4b8c-8640-17f89452148e&displaylang=en
  • Microsoft Sync Framework 1.0:http://go.microsoft.com/fwlink/?LinkID=141237
  • SQL Server 2008 Native Client:http://go.microsoft.com/fwlink/?LinkId=123718
  • Windows Identity Foundation:http://www.microsoft.com/downloads/details.aspx?FamilyID=eb9c345f-e830-40b8-a5fe-ae7a864c4d76&displaylang=en
  • Chart Controls:http://go.microsoft.com/fwlink/?LinkID=122517
  • ADOMD.Net:http://download.microsoft.com/download/A/D/0/AD021EF1-9CBC-4D11-AB51-6A65019D4706/SQLSERVER2008_ASADOMD10.msi
  •  

    以管理员身份打开命令提示符,如图 2- 2所示。

     

    2- 2:以管理员身份打开命令提示符

     

    在打开的命令提示符窗口中,输入如下指令,回车并运行。注意,下面的指令文本是一整行,而并非多条指令,在输入指令时,请确保指令文本中间没有换行符。建议先打开记事本,然后将指令先在记事本中输入完整,然后粘贴到命令提示符中后回车运行。

     

    start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ManagementScriptingTools;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-RequestFiltering;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI;WCF-HTTP-Activation;WCF-NonHTTP-Activation

     

    等待一会儿,在上面这行指令运行完成后。打开"控制面板 – 程序 – 打开或关闭Windows功能",在打开的窗口中,确认如图 2- 3与图 2- 4所示的Windows功能,都已经启用了。如果有缺失的功能,可以在这个窗口手工启用它们。

     

    2- 3:需要启用的Windows 7功能(1

     

    2- 4:需要启用的Windows 7功能(2

     

    2.1.2.2 安装SQL Server 2008 R2

     

    接下来,在Windows 7操作系统中安装SQL Server 2008 R2。在Windows 7中安装SQL Server 2008 R2并没有什么特别的,基本上和在Windows Server 2008/2008 R2操作系统中一样。图 2- 5到图 2- 9展示了笔者在自己的开发环境中安装SQL Server 2008 R2的设置,图片中的"kaneboy-pc\kaneboy"是笔者环境中开发机器的管理员帐户,其中"kaneboy-pc"是机器名。

     

    2- 5:安装SQL Server 2008 R21

     

    2- 6:安装SQL Server 2008 R22

     

    2- 7:安装SQL Server 2008 R23

     

    2- 8:安装SQL Server 2008 R24

     

    2- 9:安装SQL Server 2008 R25

     

    安装完成后,如果一切顺利,在Windows 7的任务管理器中,应该可以看到SQL Server相关服务的进程,如图 2- 10所示。

     

    2- 10SQL Server相关服务的进程

     

    提示 如果你选择安装SQL Server 2008,而不是SQL Server 2008 R2,那么在安装完成SQL Server 2008之后,需要继续分别安装下面这两个SQL Server 2008的更新包:

    • SQL Server 2008 SP1
    • SQL Server 2008 SP1 CU2(积累更新包2,下载地址:http://support.microsoft.com/kb/970315)或更高版本的CU

     

    2.1.2.3 安装SharePoint 2010

     

    为了将SharePoint 2010安装到系统中,建议将SharePoint 2010的安装文件先复制到Windows 7磁盘文件系统中。如果你手里的SharePoint 2010安装介质是光盘或ISO文件,只需直接将光盘或ISO中包含的文件直接复制到Windows 7中即可。如果安装介质是一个.exe可执行文件,那么可以通过在命令提示符中,在安装程序的后面加上"/extract"参数(例如:"SharePointServer2010.exe /extract")运行安装程序,就能将安装程序解压到指定的磁盘文件夹中。

     

    2- 11:将安装文件复制到Windows 7磁盘文件系统中

     

    打开"PrerequisiteInstallerFiles\FilterPack"文件夹,双击并运行"FilterPack.msi"。这是唯一一个内置在SharePoint 2010安装文件中的额外必需组件,它包含了SharePoint 2010搜索引擎将用到的各种iFilter。

     

    打开"Files\SetupFarm"文件夹中的"config.xml"文件,在"<Configuration>"节点中增加一个新的XML节点:

     

    <Setting Id="AllowWindowsClientInstall" Value="True"/>

     

    2- 12:修改后的"config.xml"文件

     

    以管理员身份打开命令提示符(如图 2- 2所示),将当前文件夹设置为放置SharePoint 2010安装文件的目录,然后执行"setup.exe /config Files\SetupFarm\config.xml"指令,启动SharePoint 2010安装程序,如图 2- 13所示。

     

    2- 13:执行SharePoint 2010安装程序

     

    在如图 2- 14所示的安装类型选择界面中,选择"服务器场"类型。在如图 2- 15所示的服务器类型选择界面中,选择"完整"类型。

     

    2- 14:安装类型选择界面

     

    2- 15:服务器类型选择界面

     

    耐心等待SharePoint 2010安装完成,当出现如所示的提示界面时,不要选择"立即运行SharePoint产品配置向导"复选框,直接点击"关闭"按钮即可,如图 2- 16所示。

     

    2- 16SharePoint 2010安装完成

     

    以管理员身份打开命令提示符窗口,将当前目录设置为"Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN"目录,然后在命令提示符窗口中输入"psconfig.exe –cmd configdb –create –server <开发机器的机器名> -database SharePoint_Config –user <开发机器管理员帐户> -password <开发机器管理员帐户的密码> -passphrase <指定一个用来加密SharePoint服务器场通讯的密码>"指令并运行,这将为SharePoint 2010系统创建配置数据库。图 2- 17是运行此指令后的输出结果。虽然在执行过程中,会输出"本地帐户应只能在独立模式中使用"之类的信息,但这并不会阻止成功创建配置数据库。

     

    2- 17:在命令行使用SharePoint配置向导创建配置数据库

     

    然后,直接从开始菜单中打开SharePoint 2010产品配置向导,配置向导会发现我们之前通过命令行所创建的配置数据库,在图 2- 18所示的界面上,选择"不断开与此服务器场的连接",点击"下一步"。

     

    2- 18:运行SharePoint 2010产品配置向导(1

     

    在图 2- 19所示的界面中,为SharePoint管理中心手工指定一个端口号或是使用默认的随机端口号,然后连续点击"下一步",完成SharePoint 2010产品配置向导的运行。如果一切顺利,你将看到如图 2- 20所示的界面。

     

    2- 19:运行SharePoint 2010产品配置向导(2

     

    2- 20SharePoint 2010配置成功

     

    SharePoint 2010产品配置向导运行成功完成之后,会自动打开SharePoint 2010管理中心。第一次打开管理中心网站时,会提示管理员运行服务器场配置向导。建议管理员使用这个配置向导,对服务器场进行初始设置、安装必要的服务并创建第一个网站集。如何对SharePoint 2010服务器场进行配置管理已经超出了本书的范围,读者可以参考/*《SharePoint 2010管理员指南》*/一书。

     

    2- 21SharePoint 2010服务器场配置向导

     

    提示Windows 7操作系统上运行完成配置向导,第一次打开SharePoint 2010管理中心网站时,有可能无法正常打开。如果遇到这样的情况,建议将当前浏览器关闭,然后使用"IISReset"指令重新启动IIS,然后再尝试通过开始菜单打开SharePoint 2010管理中心。

     

    提示Windows 7操作系统上,无法安装Office Web Applications组件。

     

    2.1.2.4 安装其他软件

     

    在成功安装SharePoint 2010之后,开发人员可以继续在开发环境中安装如下软件:

    • Office 2010客户端应用程序
    • SharePoint Designer 2010
    • Visio 2010
    • Visual Studio 2010

    posted on 2010-06-07 20:53:16 by kaneboy  评论(1) 阅读(15215)

     
    2010年06月01日

    下图中显示的这个菜单也就是所谓的ECB(Edit Control Block)菜单。在SharePoint 2007中,所有列表项、文档、文件夹都有ECB菜单。ECB菜单不仅会出现在列表或文档库的视图页面中,如果我们在任何一个页面中放置一个列表视图Web部件(List View Web Part),同样在这个Web部件中,也可以显示ECB菜单。

    image

    ECB菜单控制器的作用,就是可以让网站管理员能够向任何ECB菜单中添加自己想要的自定义菜单项,同时也能删除任何一个ECB菜单中的任何内置菜单项。通过基于“规则”的管理,管理员能够以非常灵活的方式,控制ECB菜单的显示。

    下面是一些场景示例,举例说明了通过ECB菜单控制器能做到的控制粒度:
    ● 将整个网站的所有列表项与文件的ECB菜单中的“管理权限”菜单项去掉,但是保留文件夹ECB菜单上的“管理权限”菜单项。
    ● 向网站中内容类型为“联系人”的列表项(无论其位于哪个列表中)的ECB菜单中,添加一个“添加此人为好友”的菜单项。
    ● 从“共享文档”文档库的ECB菜单中,去掉除“查看属性”之外的所有内置菜单项,同时为这个文档库的所有文件夹的ECB菜单添加一个“将此文件夹归档”菜单项。
    ● 将显示在网站首页上的所有ECB菜单中的“删除”菜单项去掉,但保留首页上文件夹ECB菜单中的“删除”菜单项。

    后面的部分是ECB菜单控制器的简单使用说明。

    下载ECB菜单控制器的安装文件后(这是一个.wsp解决方案包),将其安装到SharePoint 2007系统中。它会在网站层次安装一个Feature,进入到网站功能管理页面,激活“ECB菜单项控制器”Feature。ECB菜单控制器以网站层级来激活或关闭,管理员可以在需要此功能的网站中激活它。

    image 

    激活Feature后,在网站管理页面的外观区域,会多出一个“ECB菜单项”链接。点击此链接,就会打开ECB菜单项控制规则管理界面。

    image 

    在ECB菜单项控制规则管理界面,管理员可以添加两种规则,“ECB菜单项添加规则”和“ECB菜单项移除规则”。前者用来定义一个新增ECB菜单项的规则,后者用来定义一个将内置ECB菜单项删除的规则。

    image 

    下图是创建一个ECB菜单项添加规则的界面。

    image 

    每个属性的说明如下:
    ● 新ECB菜单项标题:新建的ECB菜单项的显示文本。
    ● 新ECB菜单项点击事件:用户点击新建的ECB菜单项时,执行的JS脚本,可以包含预定义的Token。
    ● 新ECB菜单项显示顺序:如果有多个新建的ECB菜单项,可以通过这个属性定义它们的显示顺序。
    ● 应用于列表:用来指定当前规则只作用于某个特定的列表(或文档库),如果留空则表示将作用于所有列表。
    ● 应用于特定页面:用来指定当前规则只作用于某个特定的页面,可以只在这个属性中输入Url的一部分,例如输入“Forms/AllItems.aspx”,就● 可以指定当前规则仅作用于所有列表的默认视图页面。
    ● 应用于内容类型:如果只希望新的ECB菜单项只出现在某个内容类型的列表项(或文档)的ECB菜单中,那么就可以使用这个属性。例如,● 由于所有文件夹的内容类型都是“Folder”,如果希望给所有文件夹应用规则,那么可以指定将规则应用于“Folder”内容类型。
    ● 应用于文件夹:一个是/否选项,用来直接指定当前规则是否将应用于文件夹。
    ● 网站管理员例外:一个是/否选项,用来指定在管理员浏览页面时,是否也应用规则。这个选项更多的用于删除ECB菜单项的场景。
    ● 启用规则:一个是/否选项,指定此规则是否生效。

    下面是创建ECB菜单项移除规则的界面。

    image 

    ECB菜单项移除规则非常简单,只需要直接指定要移除的菜单项即可,例如“管理权限”。支持指定并移除二级菜单项,例如可以将“发送到”菜单项下面的某个子菜单项隐藏。移除规则的可设置条件和添加规则是一样的。

    关于ECB菜单控制器的一些额外功能说明:
    ● 一个规则所包含的所有条件,将是“与”的关系。即只有在规则所包含的多个条件都满足的情况下,规则才会生效。所有的条件都是可选的,如果某个规则没有设置任何条件,那么这个规则将被应用到网站的所有位置(所有列表、文档库、页面上)。
    ● ECB菜单控制器对普通页面上的列表视图Web部件也同样生效。

    下载ECB菜单控制器安装包。这个组件并未经过完整测试,我的开发和使用环境都是英文版的SharePoint 2007。如果你在使用中遇到任何问题,请告诉我(kaneboy [a] gmail.com)。

    posted on 2010-06-01 23:07:43 by kaneboy  评论(1) 阅读(16635)

     
    2010年04月19日

    SharePoint产品组正式宣布了SharePoint 2010 RTM的消息。你可以在5月12日,在线观看产品发布会。根据Jie Li同志的消息,TechNet已经开始发布SharePoint 2010 RTM的技术内容。不过,似乎MSDN文档仍然还是Beta的内容,而且更新甚少。

    更新:
    有MSDN订阅账户的同志,现在可以通过MSDN订阅网站下载SharePoint 2010和Office 2010 RTM。没有的同志可以通过下面的地址下面SharePoint Foundation和SharePoint Designer:

    SharePoint Foundation 2010
    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=49c79a8a-4612-4e7d-a0b4-3bb429b46595

    SharePoint Designer 2010 x86
    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=d88a1505-849b-4587-b854-a7054ee28d66

    SharePoint Designer 2010 x64
    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=566d3f55-77a5-4298-bb9c-f55f096b125d

    posted on 2010-04-19 08:52:29 by kaneboy  评论(3) 阅读(21426)

     
    2010年04月12日

    在SharePoint平台上的众多流言中,这一定是流传得最广的流言之一:不要在一个文档库中存放超过2000个的文件(对应到列表,可以被描述成:不要在一个列表中存放超过2000个列表项)。

    好吧,以下是一些供你参考的信息:

    1、这里没有一个实际的硬性限制,所以用户的确可以在一个文档库中存放远远超过2000个的文件。一个拥有子文件夹的文档库(列表)可以存放500万个文件(列表项)。

    2、微软提供的最佳实践是:如果在一个文件夹下存放超过2000个文件(列表项),文件夹载入的性能将随着文件数量的增加而线性下降。微软对各种使用场景进行了大量的测试,请参考白皮书《Working with Large Lists in Office SharePoint Server 2007》

    3、根据第2条,如果你使用SharePoint内置的列表视图来展现文档库(列表),在一个文件夹下面最好不要存放太多文件,但是我个人觉得这是一个很保守的数字,实际上,如果你的系统硬件不是特别差,你会发现即使在一个文件夹中存放远远超过2000个文件,也不会感到太多的性能下降。当然如果可能,最好在一个文档库中创建层级式的文件夹,然后就可以在一个文档库(列表)中存放远远超过2000的文件(列表项)。所以关于这个数字,我的建议是,在你的实际系统中进行一次评估测试,得到一个更实际的结果,这样你会更有把握。任何脱离评估测试的规划都是缺乏说服力的。

    4、如果你使用了自定义界面来展现文档库(列表)数据,那么在代码中正确的使用分页查询,你应该可以在列表中直接存放很多的列表项(即使就放在一个文件夹里面),而不太受到性能的影响。

    5、即使你像第4条所说的那样,正确的在代码中使用了分页查询,但是也要考虑由于一个文档库中所有的数据都存放在一个网站中,而一个网站位于一个网站集里面,一个网站集只能使用一个Sql Server Database,而不能将其内容分拆存放到多个Database中。这也就意味着,如果一个网站集里面存放的文件数量太多,那么其所在的Database也将变得极其庞大。你也许需要考虑那个Database最终会变得多大,它会占用多大的磁盘空间,会对SQL Server造成何种影响...关于磁盘容量规划,请参考这篇文章。如果你要存放大量的文件,考虑引入EBS或RBS

    6、虽然SharePoint提供了列表,但并不意味着我们应该总是使用列表来替代数据库Table,它们各有各的好处。列表好在提供了一个内置的输入、编辑、展现界面,而且我们可以很容易的为列表数据添加诸如事件处理程序、工作流之类的东东。但是如果你的数据并不需要这些东东,而且大部分界面也需要定制,那么为什么不直接使用数据库Table?

    7、如果可能,将文档库(列表)中的数据分区存放。例如,如果你有一个存放“费用报销单”的表单库,那么就可以考虑将3个月之前提交且已经审批完成的表单自动移动到其他文件夹(或其他表单库)里面,表单库的根文件夹则总是只存放最近3个月的表单。数据的自动归档可以使用SharePoint内置的过期管理策略或使用自定义代码来完成。

    8、如果是SharePoint 2010系统,那么关于大容量文档库(列表),多了一个List Throttling功能。我会再写一篇blog专门讲述List Throttling。

    最后总结,关于这个流言,其结论应该是:PLAUSIBLE。:)

    posted on 2010-04-12 09:21:20 by kaneboy  评论(2) 阅读(21921)

     
    2010年03月28日

    这两天在研究怎么写一个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时,你没有使用默认实例名称,那么它的值可能类似"sp2010\express"这样的格式)。对每个内容数据库,都只应该使用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 on 2010-03-28 04:09:25 by kaneboy  评论(6) 阅读(22099)

     
    2010年03月20日

    很多人都希望在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 on 2010-03-20 19:00:14 by kaneboy  评论(3) 阅读(22311)

     
    2010年03月15日

    最近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 on 2010-03-15 12:47:10 by kaneboy  评论(2) 阅读(22550)

     
    2010年02月09日

    经常有人问我这个问题,SharePoint服务器将连接配置数据库的连接字符串保存在什么地方?虽然其他SharePoint服务器场设置都是保存到了配置数据库里面,但连接配置数据库本身的连接字符串,肯定是只能存放在SharePoint服务器上的。

    简单来说,SharePoint服务器将这个连接字符串信息保存在注册表中,具体位置是在"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\Secure\ConfigDB"节点的"dsn"键值中。

    image 

    提示:在注册表里面进行更改,是不被微软正式Support的,所以不要尝试做这样的操作!

    posted on 2010-02-09 16:06:13 by kaneboy  评论(1) 阅读(24275)

     
    2010年02月08日

    如果不了解什么是Application Page,可以参考我以前写过的这篇文章。SharePoint 2010的页面模型没有太多的变化,基本和2007保持一致。对于开发人员而言,为SharePoint 2010创建一个Application Page,相比2007倒是方便了很多,因为Visual Studio 2010提供了很好的工具支持。

    如下图所示,开发人员可以直接在一个SharePoint项目中添加一个Application Page:
    image

    在SharePoint 2010中,自定义Application Page默认仍然是从Microsoft.SharePoint.WebControls.LayoutsPageBase类继承而来:
    image 

    除了在工具上的支持之外,SharePoint 2010的Application Page也已经可以使用网站公用的Master Page了,这意味着在设计师为网站设计了一个自定义的Master Page之后,Application Page也能呈现出与网站内容页面一致的效果了。

    如下图所示,通过指定Application Page页面的<@ Page>标签中的"DynamicMasterPageFile"属性(注意不是"MasterPageFile")的值,就能让Application Page直接使用用户当前所浏览网站的Master Page。
    image 

    "DynamicMasterPageFile"属性的值可以是:
    ■ "~masterurl/default.master":表示将使用SPWeb.MasterUrl属性所标识的Master Page,默认是网站母板页样式库中的"v4.master"文件。
    ■ "~masterurl/custom.master":表示将使用SPWeb.CustomMasterUrl属性所标识的Master Page,默认它和SPWeb.MasterUrl的值保持一致,都是引用的"v4.master"。

    如果你仍然希望让Application Page使用"14\templates\_layouts"目录下的"application.master"或"applicationv4.master",那么不要使用"DynamicMasterPageFile"属性,而仍然应该使用"MasterPageFile"属性。

    虽然通过Application Page的"DynamicMasterPageFile"属性能让Application Page使用网站的Master Page,但系统管理员也可以取消这项设定。在SharePoint 2010管理中心的Web应用程序管理中,通过将下图所示的选项设置为“否”,就能让Application Page不能引用网站的Master Page:
    image

    当然也可以通过Object Model来完成同样的操作:
    image 

    如果通过上面的这两个方法,不允许Application Page使用网站的Master Page,同时又在"<@ Page>"中指定了"DynamicMasterPageFile"属性,那么Application Page会在"14\templates\layouts"目录中寻找"v4.master"。

    最后,下面这几个特殊的Application Page,由于它们可能需要在任何场合(比如在用户没有通过认证的情况下)下被显示,所以它们都会使用"simple.master"这个最简Master Page:
    ■ Login.aspx
    ■ SignOut.aspx
    ■ Error.aspx
    ■ ReqAcc.aspx
    ■ Confirmation.aspx
    ■ WebDeleted.aspx
    ■ AccessDenied.aspx

    posted on 2010-02-08 03:03:27 by kaneboy  评论(1) 阅读(24314)

     
    2010年01月19日

    Q:我在安装新版本的QuickPart,替换已有的旧版本时,总有问题,应该怎么办?
    A:请到QuickPart项目网站,下载“How to Uninstall QuickPart”文档,然后按照文档中的说明,先从服务器上彻底删除旧版本QuickPart,然后再重新安装新版本QuickPart。

    Q:我能修改QuickPart的源代码,添加自己想要的新功能吗?
    A:请到QuickPart项目网站,下载“Source Code”包,然后修改源码自己编译即可。

    Q:我下载了QuickPart源码项目,用Visual Studio打开后,会提示错误?
    A:QuickPart 1.03版本的源码项目使用了Visual Studio 2008 + VSeWSS 1.3,请确认你使用了正确的Visual Studio版本,并安装了VSeWSS 1.3扩展包。

    QuickPart 1.03下载页面

    posted on 2010-01-19 15:49:08 by kaneboy  评论(3) 阅读(26270)

     

    上周末,在SharePoint 2010 Day技术活动上,我做了一个纯演示的课程,演示了Visual Studio 2010中所包含的SharePoint 2010开发功能。



    下载更高清晰度的WMV文件

    posted on 2010-01-19 14:59:23 by kaneboy  评论(7) 阅读(26510)

     
    2010年01月10日
    今天,Erucy和我将几个小工具发布到了codeplex上。


    WPManager(Web部件管理器)
    用于在SharePoint2007上部署、卸载Web部件,无需编写dwp/webpart描述文件,无需编写manifest,无需手动修改web.config,只需要打开生成的dll文件,选择部署位置,点击“部署”就可以一切搞定。支持dll、cab和wsp三种部署方式。同时支持部分Web部件的卸载功能,同时还有个彩蛋。
    地址:http://wpmanager.codeplex.com

    OSSEventManager(事件处理程序管理器)
    可以方便的在一个列表上部署、挂载、卸载SharePoint 2007的列表条目事件处理程序。
    地址:http://osseventmanager.codeplex.com

    Friendly Query
    使用类似T-SQL语句的形式进行SharePoint列表查询,无需任何CAML。之前写过一篇blog:点击这里
    地址:http://fquery.codeplex.com/

    清除已删除用户
    如果使用自定义Membership Provider来实现SharePoint网站用户认证,从自定义用户数据源中删除了用户之后,还需要手工从SharePoint网站中删除对应的SharePoint用户。这个工具可以帮助管理员自动清除那些已从数据源中删除的用户。
    地址:http://sptoolscn.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=38497

    posted on 2010-01-10 01:57:23 by kaneboy  评论(1) 阅读(26929)

     
    2010年01月02日

    在自己的blog上发布计划的好处之一,就是可以督促自己。如果当2010年年底的时候,这些计划没完成,就请大家尽情的BS我吧。

    1、搞清楚SharePoint 2010。这包括Silverlight、WCF、PowerShell、jQuery等等所有将用到的东西。
    2、写完这本书
    3、学会Python,至少能在GAE上写一个应用。
    4、把往年的欠账还了。欠账包括:看完《C++ Primer 3rd》(我是在2002年买进这本书的)、《WF高级程序设计》Chai同学好心送了我一本,可我一直扔在书柜里面)、《敏捷软件开发》(我承认,这本书也在我手里好几年了)、《代码大全 2rd》(以前只看完了一半)。
    5、至少听50个ESL Podcast

    posted on 2010-01-02 03:08:18 by kaneboy  评论(7) 阅读(26774)

     
    2009年12月25日

    如果我们使用一个SharePoint网站来存储部门/团队的文档,通常会按照我们想要的结构,预先在网站中建立好相应的文档库和文件夹。比如,我们会创建一个“技术文档库”,来存放技术类别的文档,同时创建一个“业务文档库”存放业务类别的文档,在“技术文档库”中,还可能按照编程语言的种类,建立诸如“CSharp”、“C++”、“Java”之类的文件夹,将技术文档按照它们所属的类别,再放置到相应的文件夹中。

    但是,无论管理员将结构建立得多么好、多么完整,用户很可能并不会按照文档实际的类别,将文档上载到正确的文档库和文件夹中。SharePoint 2010的内容管理器,能帮助网站管理员实现自动化的文档路由和存储。在用户将文档上载到网站之后,网站的内容管理器会按照事先设置的规则,自动将文档移动到正确的地方。

    内容管理器的规则,基本上基于两种判断条件:
    1、文档的内容类型。例如,属于“技术文档”内容类型的文件,移动到哪里哪里,而属于“业务文档”内容类型的文件,又是移动到哪里哪里。内容管理器规则只能处理继承自“文档”内容类型的内容类型,这意味着内容管理器只能管理文件类型的内容,而不能处理其他列表项内容类型。
    2、属性的值。基于第1种判断条件,管理员还可以再基于文档的属性,设置判断条件。比如,“技术类别”属性的值等于“Web程序”的文档,移动到哪里哪里。第2种判断条件不能独立于第1种存在。

    内容管理器是一项网站级别的功能,而并非网站集级别。所以,首先需要在网站功能管理中,启用“内容管理器”功能:
    image 

    在网站中启用了内容管理器功能之后,网站中会多出来一个“放置库”文档库。这个“放置库”是内容管理器的核心之一,实际上,所有内容管理器规则都是应用到“放置库”。

    然后在网站管理页面中,会多出来“内容管理器设置”和“内容管理器规则”链接:
    image 

    内容管理器设置界面中,是对整个网站的内容管理器功能,进行全局的设置。

    如果选择了“将新内容提交到库”选项,那么无论用户是将文档上载到网站的什么地方,这个文档都会被自动移动到“放置库”中,以对其应用规则。但是我发现Beta2中似乎有Bug,即使管理员选中了这个选项,用户上传到其他地方的文档也不会自动移动到“放置库”,这样只有上载到“放置库”中的文档,才会被应用规则。
    image

    如果选中了“允许规则将其他网站指定为目标位置”选项,那么在规则中,就能将上载的文档移动到其他网站。但是其他网站的目标位置,必须事先由管理员在“管理中心 - 一般应用程序设置 - 配置发送到连接”设置之后,才能使用。
    image 

    自动创建子文件夹的选项非常有用,这样可以避免在一个文件夹中,存放太多的内容。不建议在一个文件夹中,存放超过5000个文件。
    image

    如果目标位置已经存在同名文件,那么下面的选项将决定内容管理器如何处理这种情况。但是如果管理员选择了使用版本控制,但目标文档库又并未启用版本控制功能,那么内容管理器仍然是使用自动在文件名后面添加唯一字符的方式,来进行处理。
    image

    保留文档的审核日志和属性,有助于在记录管理中对文档进行持续管理。
    image

    “规则管理员”可以让管理员指定哪些人可以设置内容管理器规则。如果一个用户是网站管理员,但是并非规则管理员,他也不能管理内容管理器规则。如果一个用户是规则管理员,但并非网站管理员,他仍然不能管理内容管理器规则。
    image

    接下来,就是为内容管理器创建规则。每个规则都有优先级,优先级高的规则会先被执行,这样如果一个文档符合多个规则的条件,那么只有优先级最高的规则会被应用到文档。
    image

    下面的截图就是按照提交的文档的内容类型,进行条件筛选。“替换名称”可以用于同时处理多个相关的内容类型(比如有父子继承关系的内容类型)的情况。
    image 

    “基于属性的条件”可以让管理员再基于选中的内容类型的必填属性,来设置过滤条件。
    image

    下面是在添加了2条规则之后的情景,两条规则实际上都是针对一种“技术文档”内容类型,但是第1条规则还加上了额外的属性条件过滤,来将“技术文档”中设置的是C#与Web类别的技术文档,单独存放到一个专门的地方。由于第1条规则所匹配的文档实际上是第2条规则所匹配的子集,也就是说,第2条规则覆盖了第1条规则,所以为了避免文档被应用第2条规则,管理员需要将第1条规则的优先级设置得比第2条规则高:
    image 

    配置好了内容管理器之后,当用户在网站中上载了文档之后,系统会自动提示它,内容管理器已经将文档自动转移到了新的地方,并且会显示出文档所在位置的URL路径:
    image 

    有了内容管理器,用户在上载文档时,就不再需要考虑到底将文档上载到哪个地方才合适。文档所在位置的选择,被交给了内容管理器,按照管理员所设置的规则,对文档进行自动的路由和分类。

    posted on 2009-12-25 15:33:21 by kaneboy  评论(5) 阅读(27026)

     
    2009年12月23日

    在SharePoint 2007中,我们可以在网站集中定义或定制内容类型,然后在网站集里面的所有网站中使用这些内容类型,内容类型提供了一种集中管理数据与信息类型的方式,使得信息的结构定义,与信息的实际存储能够分开。但是在2007版本中,内容类型并不能被跨网站集使用。如果我们希望所有网站集都能使用同一个定义的内容类型,就必须将其封装为Solution Package,部署到各个Web应用程序当中。

    SharePoint 2010为了让管理员可以方便的在整个服务器场范围中共享同一组内容类型,新增了内容类型集线器的功能。你可以指定一个网站集为“集线器中心”,将它的内容类型发布出来,凡是“订阅”了内容类型发布的其他网站集,就能自动将发布出来的内容类型同步到自己的内容类型库当中。

    内容类型集线器是通过Managed Metadata Service这个服务应用程序来运作,所以,需要发布和订阅内容类型的网站集,必须与同一个Managed Metadata Service服务应用程序关联起来。每一个Managed Metadata Service服务应用程序实例,都只能指定一个网站集,作为内容类型集线器“中心”,由它来发布内容类型,而其他网站集只能作为“订阅者”,“订阅”被发布的内容类型。下图是一张内容类型发布和订阅示意图(来自www.chakkaradeep.com)。
    SP2010 - Content Type Hubs

    在SharePoint 2010管理中心的服务应用程序管理中,选中Managed Metadata Service,然后点击Ribbon中的“属性”按钮:
    image

    在属性对话框的最下方,填入需要作为内容类型集线器“中心”的网站集路径,这个网站集里面定义的内容类型,将可以发布出来:
    image

    然后再次选择Managed Metadata Service服务应用程序代理,点击Ribbon中的“属性”按钮:
    image

    选中与内容类型集线器相关选项前面的复选框:
    image

    然后,在指定作为内容类型集线器“中心”的网站集里面,你可以从网站内容类型库中选择一个内容类型,然后通过点击“管理此内容类型的发布”链接,来发布这个内容类型:
    image

    SharePoint 2010服务器上定义了2个内容类型集线器相关的定时器作业,来自动进行内容类型的发布和订阅同步。它们在后台以指定的周期,自动运行以完成发布和同步操作。我们可以在管理中心网站的“监控 - 计时器作业状态”中,找到这两个定时器作业,然后手工强制立即执行(能手工立即启动一个计时器作业,也是SharePoint 2010的一个新功能)。

    首先,找到“内容类型集线器”计时器作业,然后点击“立即运行”按钮:
    image

    然后,在定时器状态页面中,切换视图到内容类型“订阅者”网站集所在的Web应用程序,找到“内容类型订户”定时器作业,并手工立即启动它的运行:
    image

    然后在内容类型“订阅者”网站集的网站内容类型库当中,您应当就会看到被同步过来的内容类型了。在“订阅者”网站集管理页面中,有一个“内容类型发布”链接,点击后能看到所有被同步过来的内容类型:
    image

    注意,被同步到“订阅者”网站集中的内容类型,是不能被修改的。如果你希望在“订阅者”网站集中,对从集线器“中心”同步过来的内容类型再进行适当的修改,例如增加一个字段,那么可以再创建一个新的内容类型,并继承自那个同步而来的内容类型,然后按照要求修改新内容类型即可。

    posted on 2009-12-23 23:48:28 by kaneboy  评论(3) 阅读(26295)

     
    2009年12月17日

    在一个企业中,有时候需要一个专门的Metadata库,用来保存各种预定义的Metadata。有了Metadata库,就能方便的为企业中的各种数字内容、数字资产应用上各种定义好的Metadata,或是用Tag的方式,为各种内容打上Tag。当为各种内容指定了Metadata或Tag之后,无论是搜索,还是浏览,都能利用这些Metadata和Tag,对搜索结果或内容视图进行分类和过滤。

    在SharePoint 2010中,提供了Managed Metadata Service,它是一项服务应用程序,能为整个服务器场,甚至整个企业(通过将一个服务器场的Managed Metadata Service发布出去),提供一个集中的Metadata存储和管理中心。

    打开管理中心的服务应用程序管理,就能看到Managed Metadata Service。选中它后,点击上方Ribbon中的“管理”按钮,就能打开术语库管理工具。
    image


    提示:如果是第一次打开术语库管理工具,可能会发现你没有权限对术语库进行更改。你需要将你自己添加到术语库管理员中:
    image

    术语库管理工具是专门用来管理Managed Metadata Service所存储的所有术语(Term)的工具。管理员可以使用它,预先定义好企业中所需要的各种术语。在术语库管理工具中,可以通过组(Group)、术语集(Term Set)来为术语进行分类。基于组,可以进行权限的定义(哪些人是术语组的管理员,哪些人是术语组的参与者)。术语可以有一个或多个子术语,一个术语也可以同时位于多个术语集中。
    image

    在默认的设置中,所有新建的术语集和术语都可以被用于Tag的作用,管理员可以手动启用或关闭这个功能:
    image

    如果管理员希望SharePoint网站的普通用户,也可以手动向术语库中添加新的术语条目,那么需要将术语集的提交政策改为“打开式”(默认是出于关闭状态,也就是只有管理员才能通过术语管理工具添加术语):
    image

    对于每个术语,管理员都可以对它进行各种操作,其中“重复使用术语”是指将此术语复用在另一个术语集中,但又并非复制一个术语,而是将一个术语“映射”到多个不同的地方:
    image 

    有些术语可能有同义词,比如“IE”与“Internet Explorer”,管理员可以为一个术语指定一个或多个同义词:
    image

    除了位于管理中心的这个全局术语库管理工具之外,网站集也有一个网站集级别的术语库管理工具,通过它,网站集管理员可以管理一个网站集所有的术语:
    image

    要在SharePoint网站中使用这些术语,只需要为列表、内容类型添加类型为“托管元数据”的栏即可。比如,在为企业所有的员工建立了术语之后,就可以为“公司项目”内容类型添加一个名为“项目负责人”的栏(注:这是一个例子,并不表示鼓励使用术语库来维护企业员工信息,用户配置文件通常是维护企业员工信息的更好工具。):
    image

    然后为这个元数据栏指定所绑定的术语节点,只有选定的术语节点中的术语,才能被填入到栏中:
    image

    然后,在为列表添加这种内容类型的列表项时,就能看到我们添加的元数据栏:
    image

    用户填写元数据栏的值的时候,随着用户输入文本,这个文本框会自动从术语库中检索匹配的术语,并显示出符合的候选术语:
    image

    或者,也可以直接浏览所有可用的术语并选择:
    image 

    在为列表项指定了元数据之后,用户甚至可以不再基于传统的列表视图方式浏览列表项,而是使用基于元数据过滤,来查看列表项。比如,用户可以基于“项目负责人”这个元数据的值,来对所有项目列表项,进行浏览。从列表设置中打开“元数据导航设置”:
    image 

    配置好了元数据导航之后,在列表视图的左下角,就能看到所列出的元数据术语,点击每个术语,就能看到与这个术语相关的列表项:
    image

    或是使用这个术语筛选器(截图上的“密钥”字样是中文版本词语翻译错误),直接筛选显示列表中的列表项数据:
    image 

    除了对列表项和文档之外,我们还能将术语用做标签。在SharePoint 2010网站中,右上角会有一个“Tags & Notes”按钮,如果你希望给当前浏览的页面做一个标签,直接点击这个按钮即可:
    image

    然后在弹出的对话框中,就能填入定义好的术语了:
    image 

    Managed Matadata使企业可以集中管理元数据,并通过它构建企业的分类体系(Taxonomy)。Managed Matadata作为一个服务应用程序,可以发布给整个服务器场、其他SharePoint服务器场,甚至企业内部的各种其他应用系统。

    posted on 2009-12-17 15:25:51 by kaneboy  评论(4) 阅读(26496)

     
    2009年12月16日

    (因为是按照自己的思绪写的,所以写得比较乱,有些部分不一定准确,后续会有更新

    Create Custom Service Class

    Service类用来定义这个自定义“Service”,也是各种功能的入口点。它继承SPIisWebService,并实现IServiceAdministration(以接入到管理系统中)。

    [Guid("E828358E-E24C-4D78-BE87-C69D458766F4")]

    public class KaneboyService : SPIisWebService, IServiceAdministration

    Service类通常实现二个构造函数:

    ·        默认构造函数

    ·        一个参数为SPFarm对象的构造函数

    public KaneboyService() { }

     

    public KaneboyService(SPFarm farm) : base(farm) { }

    IServiceAdministration的方法:

    ·        CreateApplication():创建一个SPServiceApplication对象。只有在通过运行psconfig.exefarm configuration wizard创建Service Application时才会调用它(所以对于自定义SPService,它通常不会有机会被调用)。

    ·        CreateProxy():创建一个SPServiceApplicationProxy对象。与CreateApplication()类似。

    ·        GetApplicationTypeDescription():返回对此Service的描述信息。

    ·        GetApplicationTypes():返回Service Application的类型。

    ·        GetCreateApplicationLink():如果希望可以在管理中心的“管理服务应用程序”中新建此Service Application实例,那么需要实现此方法并返回新建Service Application页面的URL

    Create Custom Service Instance Class

    Service Instance用来描述运行在每个SPServer上的Service实例。它继承SPIisWebServiceInstance

    public class KaneboyServiceInstance : SPIisWebServiceInstance

    Service Instance类的构造函数:

    ·        默认构造函数

    ·        参数如下的构造函数:

    o   一个SPServer对象,表示运行此Service实例的Server

    o   所对应的SPIisWebService对象

    public KaneboyServiceInstance() : base() { }

     

    public KaneboyServiceInstance(SPServer server, SPIisWebService service) : base(server, service) { }

    Service Instance类需要实现的方法:

    ·        TypeName属性:描述此Service Instance的名称,显示在管理UI

    Create Custom Service Application Class

    Service Application类是对Service Application的实现。它继承SPIisWebServiceApplication,并通常实现Service Contract接口。

    [IisWebServiceApplicationBackupBehavior]

    [ServiceBehavior(

            InstanceContextMode = InstanceContextMode.PerSession,

            ConcurrencyMode = ConcurrencyMode.Multiple,

            IncludeExceptionDetailInFaults = true)]

    [Guid("933A11F0-7265-4694-97C0-FE04BFB370A5")]

    public class KaneboyServiceApplication : SPIisWebServiceApplication, IKaneboyServiceContract

    Service Application类的构造函数:

    ·        默认构造函数

    ·        带下列参数的构造函数:

    o   Service Application名称

    o   所对应的SPIisWebService对象

    o   所使用的SPIisWebServiceApplicationPool对象

    public KaneboyServiceApplication() : base() { }

     

    private KaneboyServiceApplication(String name, KaneboyService service, SPIisWebServiceApplicationPool appPool) : base(name, service, appPool) { }

    Service Application需要告诉系统,如何连接到WCF Service,所以它需要实现:

    ·        InstallPath属性:返回.svc所在的目录。

    ·        VirtualPath属性:返回.svc文件的名称。

    如果在Provision这个Service Application的时候,还需要Provision数据库或其他资源,可以重载Provision()Unprovision()方法。

    创建(并Provision)一个Service Application不能直接使用它的构造函数,而是需要使用如下步骤:

    ·        创建Service Application至少需要用到如下信息:

    o   Service Application名称

    o   它所对应的SPService对象

    o   它所使用的SPIisWebServiceApplicationPool对象

    ·        通过SPService.Applications.GetValue(),确定这个Service Application是否有其他实例存在。

    ·        使用它的构造函数,新建一个实例对象。

    ·        调用SPServiceApplication.Update()保存新建的实例。

    ·        调用SPServiceApplication.AddServiceEndpoint()Service Application新建WCF Endpoint

    serviceApp.AddServiceEndpoint("http", SPIisWebServiceBindingType.Http);

    serviceApp.AddServiceEndpoint("https", SPIisWebServiceBindingType.Https, "secure");

    ·        调用SPServiceApplication.Provision()Provision它。

    创建并Provision 自定义Service Application的方法,可以放到Service Application类中,以static method提供。管理员可以使用管理中心UI(位于”ADMIN”中的自定义.aspx,路径由IServiceAdministration.GetCreateApplicationLink()指定)或自定义powershell cmdlets来完成这个操作,所以在管理中心UI或自定义cmdlets中,需要调用这个static method

    WCF Artifacts

    首先,需要一个自定义Host Factory类,继承自ServiceHostFactory

    public class KaneboyServiceHostFactory : ServiceHostFactory

    它重载CreateServiceHost()方法,创建并返回一个ServiceHost对象。

    public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)

    {

    ServiceHost serviceHost = new ServiceHost(typeof(KaneboyServiceApplication), baseAddresses);

    serviceHost.Configure(SPServiceAuthenticationMode.Claims);

    return serviceHost;

    }

    ”WebServices”这个mapped folder下面,需要放置自定义Service Application.svc文件和定义WCF channelweb.config.svc只需要通过标签告知ServiceFactory类即可。

    <%@ServiceHost Language="C#" Debug="true"

                   Service="KaneboyServiceApp1.KaneboyServiceApplication, $SharePoint.Project.AssemblyFullName$"

                   Factory="KaneboyServiceApp1.KaneboyServiceHostFactory, $SharePoint.Project.AssemblyFullName$" %>

    web.config里面需要定义Service Application将使用的channel

    <configuration>

      <system.serviceModel>

        <services>

          <service name="KaneboyServiceApp1.KaneboyServiceApplication">

            <endpoint

              address=""

              contract="KaneboyServiceApp1.IKaneboyServiceContract"

              binding="customBinding"

              bindingConfiguration="CustomServiceHttpBinding" />

            <endpoint

              address="secure"

              contract="KaneboyServiceApp1.IKaneboyServiceContract"

              binding="customBinding"

              bindingConfiguration="CustomServiceHttpsBinding" />

           </service>

        </services>

        <bindings>

          <customBinding>

            …

          </customBinding>

        </bindings>

      </system.serviceModel>

      <system.webServer>

        <security>

          …

        </security>

      </system.webServer>

    </configuration>

    Register Service on Farm

    Service注册到Farm里面,需要创建ServiceService Instance对象,并将它们PersistConfig DB中(通过调用Update())。注册可以通过一个Farm Featureactivate事件来实现。在新建ServiceService Instance对象之前,可以通过调用SPFarm.Services.GetValue()来确认是否Farm中已经注册了此服务。在Farm Featuredeactivate事件中,可以将相关的ServiceService Instance删除。

    Create and Provision Service Application

    新建Service Application的实例,可以使用管理中心UI(“管理服务应用程序”)或自定义powershell cmdlets来实现。如果是通过管理中心UI,可以在“ADMIN”中新建一个.aspx,并将其路径在Service类中通过IServiceAdministration.GetCreateApplicationLink()告知系统。

    无论哪种方法,最关键的是,如何将Service Application所使用的SPIisWebServiceApplicationPool对象传递给新建Service Application的代码。如果是使用.aspx,可以使用” ~/_admin/IisWebServiceApplicationPoolSection.ascx”控件,然后通过IisWebServiceApplicationPoolSection.GetOrCreateApplicationPool()得到用户选择的App Pool。如果是使用cmdlets,那么就通过SPIisWebServiceApplicationPoolPipeBind类来得到App Pool信息。(Check MSDN to get detail information.)

    ------------------ “Server”(App Server)”Client”(WFE)的分割线 ----------------------

    WCF Artifacts

    ”WebClients”这个mapped folder下面,将一个”client.config”文件放置到一个自定义目录中,此文件中包含了告知Service Application Proxy通过哪个channel连接到Service Application的配置信息。

    <configuration>

      <system.serviceModel>

        <client>

          <endpoint

            name="http"

            contract="KaneboyServiceApp1.IKaneboyServiceContract"

            binding="customBinding"

            bindingConfiguration="CustomServiceHttpBinding" />

          <endpoint

            name="https"

            contract="KaneboyServiceApp1.IKaneboyServiceContract"

            binding="customBinding"

            bindingConfiguration="CustomServiceHttpsBinding" />

        </client>

        <bindings>

          <customBinding>

                …

          </customBinding>

        </bindings>

      </system.serviceModel>

    </configuration>

     

    Create Custom Service Proxy Class

    Service Proxy类用来描述service consumer。它继承SPIisWebServiceProxy,并实现IServiceProxyAdministration

    [SupportedServiceApplication("933A11F0-7265-4694-97C0-FE04BFB370A5", "1.0.0.0", typeof(KaneboyServiceApplicationProxy))]

    [Guid("44203351-1E42-413E-BAAA-42A4A0788A8D")]

    public class KaneboyServiceProxy : SPIisWebServiceProxy, IServiceProxyAdministration

    Service Proxy类的构造函数:

    ·        默认构造函数

    ·        参数为SPFarm对象的构造函数

    IServiceProxyAdministration的方法:

    ·        CreateProxy():创建一个SPServiceApplicationProxy

    ·        GetProxyTypeDescription():返回对此Service Proxy的描述。

    ·        GetProxyTypes():返回Service Application Proxy的类型。

    Create Custom Service Application Proxy Class

    Service Application Proxy类定义了连接到Service Application的接口,Service Consumer通过它实现对Service的调用。它继承SPIisWebServiceApplicationProxy类。

    [IisWebServiceApplicationProxyBackupBehavior]

    [System.Runtime.InteropServices.Guid("6339C282-E7D3-4B0D-94DF-2D09773FDF80")]

    public class KaneboyServiceApplicationProxy : SPIisWebServiceApplicationProxy

    Service Application Proxy类的构造函数:

    ·        默认构造函数

    ·        包含以下参数的构造函数:

    o   Service Application Proxy的名称

    o   所对应的Service Proxy对象

    o   Service ApplicationEndpoint URL

    public KaneboyServiceApplicationProxy() : base() {}

     

    public KaneboyServiceApplicationProxy(String name, KaneboyServiceProxy serviceProxy, Uri serviceEndpointUri) : base(name, serviceProxy, serviceEndpointUri)

    {

    _loadBalancer = new SPRoundRobinServiceLoadBalancer(serviceEndpointUri);

    }

    由于Service Application通常需要Load Balance的能力,所以Service Application Proxy通常会包含一个SPServiceLoadBalancer类型field,它可以使用SharePoint内置提供的SPRoundRobinServiceLoadBalancer类来实例化。SPRoundRobinServiceLoadBalancer类需要给出Service ApplicationURL来进行构造。

    Service Application Proxy要实现的方法:

    ·        一个根据Service ApplicationUrl,获取Endpoint Configuration名称(对应到client.config”<Endpoint>”节点的”name”属性)的方法(如“GetEndpointConfigurationName()”),Endpoint Configuration的名称通常是“http”和“https”。

    ·        一个创建并返回ChannelFactory<T>的方法(如“CreateChannelFactory()”),它需要读取client.config中的信息。

    private ChannelFactory<T> CreateChannelFactory<T>(string endpointConfigName)

    {

    // open client.config

    string clientConfigPath = SPUtility.GetGenericSetupPath(@"WebClients\KaneboyServiceApp1");

    Configuration clientConfig = OpenClientConfiguration(clientConfigPath);

    ConfigurationChannelFactory<T> factory = new ConfigurationChannelFactory<T>(endpointConfigName, clientConfig, null);

     

    // configure the channel factory for IDFx claims auth

    factory.ConfigureCredentials(SPServiceAuthenticationMode.Claims);

     

    return factory;

    }

    ·        一个获取ChannelService Contract接口)的方法,通过调用ChannelFactory. CreateChannelActingAsLoggedOnUser<T>(),来获取Channel

    private IKaneboyServiceContract GetChannel(Uri address)

    {

        // get the endpoint config name

        string endpointConfigName = GetEndpointConfigurationName(address);

     

        ChannelFactory<IKaneboyServiceContract> channelFactory = CreateChannelFactory<IKaneboyServiceContract>(endpointConfigName);

     

        IKaneboyServiceContract channel  = channelFactory.CreateChannelActingAsLoggedOnUser<IKaneboyServiceContract>(new EndpointAddress(address));

        return channel;

    }

    结合以上的Helper方法,就可以拿到可以透过WCF远程调用Service ApplicationChannel对象。

    创建(并Provision)一个Service Application Proxy的步骤如下:

    ·        调用Service Application Proxy构造函数,新建实例。

    ·        调用SPServiceApplicationProxy.Update(true)将对象persistConfigDB中。

    ·        调用SPServiceApplicationProxy.Provision()

    类似Service Application,创建Service Application Proxy的方法可以放到此类中,以static method的方式提供。

    Create and Provision Service Application Proxy

    新建并Provision Service Application Proxy,类似Service Application,可以使用管理中心UI或自定义powershell cmelets实现。

    如果是使用管理中心UI,可以在创建并ProvisionService Application之后,紧接着创建Service Application Proxy。如果是创建cmdlets,可以使用SPServiceApplicationPipeBind来得到其所对应的Service Application

    Invoke Service

    通过Service Application Proxy调用Service Application所提供的功能,步骤如下:

    ·        获取SPServiceApplicationProxy对象,可以通过SPServiceContext.GetDefaultProxy()来获得。

    ·        调用SPServiceApplicationProxy对象所持有的SPServiceLoadBalancer对象的BeginOperation()获取一个SPServiceLoadBalancerContext对象,然后通过使用SPServiceLoadBalancerContext.EndpointAddress拿到这次请求需要调用的Endpoint Url。使用此Url,并通过调用Service Application Proxy中的Helper方法,拿到IChannel对象,也就是实现了Service Contract的对象。

    ·        调用IChannel上的方法

    ·        使用IChannel.Close()关闭连接。

    ·        调用SPServiceLoadBalancer.EndOperation()告知完成了Load Balance操作。

    posted on 2009-12-16 02:53:39 by kaneboy  评论(4) 阅读(26094)

     
    2009年12月08日

    (这一辑是有关开发的内容)

    在开发SharePoint 2007应用程序的时候,性能是我们很可能面临的一大挑战。我们最不希望看到的,就是用户刷新一个页面之后,需要等上好几秒钟(或更长时间),才能看到页面缓慢的打开。如果真的遇到性能上的问题,那么在进行性能优化之前,第一个需要了解的事情,就是“系统性能瓶颈在哪里?”也就是说,如果不能找到系统运行缓慢的原因,那么性能优化也就无从着手了。

    找到系统瓶颈的工具有很多,从Windows Server内置的性能监控器,到SQL Profile、CLR Profile等等,都是非常有用的工具。而对于一个SharePoint页面,似乎则没有什么特别好用的恶工具,能够快捷明了的告诉开发人员,页面上的各个部件对于性能,都会造成什么样的印象,都各自占用了多长的运行周期。

    开发人员面板(Developer Dashboard)是在SharePoint 2010中一个新增的功能。它是一个位于页面下面的信息面板,能直接显示出当前页面上的各个组件的运行时间、当前页面的运行会产生哪些数据库调用、每个数据库调用又会占用多少时间等等信息。如果发现某个页面运行缓慢,那么通过开发人员面板,开发人员就可以迅速找到导致页面慢如蜗牛的罪魁祸首了。

    下面是SharePoint 2010工作组网站默认首页的开发人员面板:
    image 

    其中包含了页面上各个控件的执行时间:
    image 

    当前Web请求的一些有用信息:
    image

    当前页面所引发的所有数据库的调用,以及它们的执行时间:
    image

    点击每个数据库调用,还能看到这个数据库调用的详细信息,包括所执行的SQL语句全文、调用堆栈、IO Stats等信息:
    image 

    开发人员面板是一个服务器场级别的设置,它可以在三个状态间进行切换:关闭(默认状态)、打开、按需打开。当它处于打开状态时,每个页面(包括网站页面和应用程序页面)的下方都会显示开发人员面板。当它处于按需打开状态时,每个页面的右上角会有一个管理员可见的小图标,管理员可以点击这个小图标切换显示或关闭开发人员面板。

    更改服务器场开发人员面板设置的方法是使用stsadm.exe命令行指令:
    image

    上面的指令中,-pv参数的值可以是on、off、ondemand,分别表示打开、关闭、按需打开。

    如果愿意,你还可以在代码中更改服务器场开发人员面板的设置:
    image

    不过要注意的是,由于SharePoint的安全限制,上面的代码只能运行在管理中心网站的页面上,或是独立的Windows应用程序(比如命令行程序)中。如果试图在普通网站的页面上运行这些代码(比如将代码放到一个Web Part中,然后将其部署到一个工作组网站页面上),将会抛出SecurityException。

    posted on 2009-12-08 23:15:40 by kaneboy  评论(0) 阅读(26883)

     
    2009年12月05日

    Office Web Applications可以让用户在浏览器里面,直接查看和编辑Word、Excel、PowerPoint和OneNote文档,而无需在客户端安装相应的Office程序。

    在网站集功能管理中,激活“Office Web Apps”,就能在当前网站集使用Office Web Apps功能了:
    image

    Office Web Apps的使用非常简单,直接使用文档的操作菜单中的“在浏览器中查看”和“在浏览器中编辑”菜单项就可以了:
    image

    当然,由于浏览器的能力限制,不可能做到像Office客户端程序那样丰富的编辑功能:
    image 

    能“插入”的项目也比较少:
    image

    但有些功能还做得像模像样:
    image

    这是编辑PowerPoint幻灯片的样子:
    image

    利用Office Web Apps播放幻灯片的效果相当不错,包括幻灯片中的动画效果,都基本能够原样的表现出来。

    Office Web Apps另外一个值得一提的特性,就是它能支持多人同时在浏览器里面对一个文档进行编辑(但Word和PowerPoint文档在Beta2中不支持多人同时编辑,不知道正式版的情况如何)。

    比如,一开始只有一位同志在浏览器中编辑这个Excel工作表,在右下角能看到“1 person editing”的提示信息:
    image


    这时,另外一位同志在浏览器中也打开了同一份文档开始编辑:
    image

    这时页面右下角会立即出现提示信息,告诉用户,有另外一位同志,也开始编辑这个工作表了:
    image

    点击后能看到当前编辑者的名单: 
    image

    那么多人打开同一份文档编辑的时候,是如何反应别人的编辑情况呢?Office Web Apps会自动将每个人的修改信息,发送给其他编辑者,这样,在每个人的浏览器中,都能反应出所有编辑者的修改结果。

    最后,Office Web Apps是否仅支持IE浏览器呢?答案当然是否定的。在上面的两人同时编辑文档的截图中,您应该能看出来,右边那位同志使用的,是FireFox浏览器。

    更新(2009/12/08):
    1、对于多人同时编辑文档,支持情况如下:
    Excel文档支持多人通过Office Web Apps同时编辑;
    Word和PowerPoint文档支持多人通过Office客户端程序打开文档实现同时编辑;
    OneNote文档支持多人通过Office Web Apps或通过Office客户端程序打开文档同时编辑。
    2、Office Web Apps支持仅允许用户通过浏览器查看文档,而不允许用户下载文档。

    posted on 2009-12-05 03:44:04 by kaneboy  评论(8) 阅读(28416)

     

    在Office 2010客户端程序中,增加了SharePoint Workspace 2010。这是一个SharePoint 2010的“客户端”程序,可以用来离线同步SharePoint网站的文档和数据。

    在SharePoint网站的“网站操作”菜单中,有一个“同步到SharePoint工作去”菜单项:

    image

    文档库的Ribbon菜单中也同样有这样一个菜单项:
    image 

    点击这个“同步到SharePoint工作区”,就会自动启动客户端的SharePoint Workspace:
    image 

    当然,我们可以仅仅将所需要的网站内容同步到本地:
    image

    配置完成了同步之后,在SharePoint Workspace中就能看到与SharePoint网站同名的工作区:
    image 

    打开这个工作区,我们就可以看到同步到本地的所有SharePoint数据了:
    image

    可以看到,我们通过SharePoint Workspace,基本上可以完成绝大部分对SharePoint网站数据的操作。比如,对于文档库,我们同样可以在SharePoint Workspace中进行新建、上载、签入/签出、搜索等等操作。当然,对文档的查看和编辑更是没有问题。
    image

    操作列表中的列表项,也同样没有问题。比如,为“任务”列表新增一个列表项:
    image

    列表中定义的视图,同样也能在SharePoint Workspace中得到体现:
    image

    在SharePoint Workspace中对网站数据进行了修改之后,可以通过“同步”按钮将数据同步回SharePoint服务器。
    image

    有了SharePoint Workspace,用户能够更加方便的使用SharePoint。用户可以将SharePoint网站的数据同步到自己的笔记本电脑上,这样即使下班回家,也能通过SharePoint Workspace访问和编辑SharePoint网站上的数据,第二天回到办公室,连接上网络之后,再将更改同步回SharePoint服务器。

    另外一个应用场景是可以更方便的发布信息。如果一个用户每天都需要向SharePoint网站的某个列表中发布数据,例如,向“通知”列表发布新的部门通知,有了SharePoint Workspace,用户不必在浏览器中打开SharePoint网站,而是可以直接在SharePoint Workspace中向“通知”列表中添加新的数据,然后再将这些数据同步到SharePoint网站。

    posted on 2009-12-05 02:35:30 by kaneboy  评论(4) 阅读(29201)

     

    有时候,我们会有一组关联度很高的文档,它们都是属于某个主题,或通常互相引用。比如,关于某个项目的一组Word文档,或是TechEd会议的所有SharePoint相关的幻灯片文档。对于这样一组关联度很高的文档,在SharePoint 2007中,我们要么将它们放在一个单独的文件夹中,要么单独创建一个文档库存放它们。SharePoint 2010增加了一个新特性:文档集,就是用来专门管理一组关联度很高的文档。

    首先,在网站集的功能管理中,激活“文档集”功能:
    image


    然后,为希望使用文档集功能的文档库,添加上“文档集”内容类型:
    image
    image

    然后在这个文档库的“新建文档”菜单中,就会增加“文档集”选项:
    image

    在新建文档集的窗口中,输入文档集的信息:
    image 

    文档集被创建之后,会有一个专门的文档集页面,来让用户查看和管理这个文档集:
    image 

    对一个文档集,我们可以对它进行相应的管理,包括为它设置单独的权限、为它附加工作流等等:
    image

    我们为文档集上载一组文档:
    image

    在文档库的视图中,一个文档集显示成一个项目(虽然它里面实际包含了多个子文档):
    image

    当使用搜索功能的时候,文档集中的文档可以被直接搜索到,同时文档集本身也会被包含在搜索结果中:
    image

    posted on 2009-12-05 01:40:15 by kaneboy  评论(2) 阅读(26998)

     
    2009年12月02日

    在拿到SharePoint 2010 Beta2的安装文件之后,安装它整体而言并不太麻烦。博客园的wengnet写了两篇图文并茂的文章介绍SharePoint 2010的安装(这里这里)。如果您在安装的时候遇到问题,下面是一些可能有帮助的信息:

    1、安装序列号在这里
    2、动手安装之前最好仔细阅读这篇文章。里面包含了你需要下载的补丁、当与DC安装在一起时如何启用Office Web App等大量提示性信息。
    3、这里有一篇非常完整的从头到尾安装SharePoint 2010的文章,全程有截图和说明。
    4、如果在尝试安装一个虚拟机,可以参考这里,按照说明注册后下载一个指导的PDF文档。
    5、这个版本毕竟还是测试版,不可能没有问题。如果遇到了安装和开发的问题,请参考这里
    6、如果在使用Forms Services时出现“StateServiceLocalizedException”异常,请参考这里

    posted on 2009-12-02 01:42:47 by kaneboy  评论(2) 阅读(28249)

     
    2009年12月01日

    花了一点时间,把微软发布的一份SharePoint 2010学习指南翻译成了中文。内容其实不是很多,就两页,主要是当前一些学习资料的链接。如果想开始学习SharePoint 2010,倒是一份不错的学习指引。

    image

    点击下载PDF文件

    posted on 2009-12-01 23:02:05 by kaneboy  评论(2) 阅读(27075)

     
    2009年11月19日
    2009年11月04日

    使用过Office 2007的同学一定知道,Office 2007引入了一种全新的界面模式:Ribbon。在SharePoint 2010中,界面风格也将使用类似的Ribbon界面。Ribbon界面所显示的菜单和选项,将随着用户所在的页面以及用户当前可以进行的操作,而动态的进行调整。

    下图是使用“Team Site”模板所创建出来的一个SharePoint 2010网站的首页:

    clip_image002

    在页面的上方区域,就能够看到相关的两个Ribbon面板:

    clip_image004

    其中“Browse”是标准的浏览模式,而“Page”,则表示了这个Ribbon面板中将放置与当前正在浏览的页面有关的页面操作。如果我们点击“Page”面板,就能够看到:

    clip_image006

    在“Page”这个面板中,包含了“Edit”(编辑当前页面)、“Check Out”(将当前页面签出)、“Edit Properties”(修改当前页面的属性)等按钮。有一些按钮本身是包含了子菜单的,比如“Edit”按钮:

    clip_image008

    如果我们点击“Edit”按钮,开始编辑当前页面,可以看到页面上方的Ribbon区域所显示的面板,也会自动调整为相应的编辑工具:

    clip_image010

    在页面编辑状态之下,我们可以使用Ribbon中的“Save”按钮,来保存我们所进行的更改:

    clip_image012

    现在让我们打开一个列表,可以看到,列表视图也发生了很大的变化。用户的所有操作,同样全部被放置到了上方的Ribbon区域:

    clip_image014

    对于列表而言,Ribbon区域中所显示的“List Tools”中的“Items”和“List”,分别表示了与列表项和列表相关的操作。比如,当我们点击“List”时,就能看到各种与当前列表相关的操作出现在了Ribbon区域:

    clip_image016

    现在让我们尝试添加一个新的列表项,这时可以看到另外一个界面上的重大变化,“对话框”的出现:

    clip_image018

    在2007版本中,几乎所有的界面都是通过单独的页面来实现,当用户需要添加或编辑列表项时,都是转到相应的页面,完成操作后再跳转回来。SharePoint 2010的“对话框”界面,使用户的操作更简洁,也减少了页面之间的跳转。

    对于列表项的编辑,同样适用了“对话框”界面。除此之外,为了方便用户同时对多个列表项进行操作,列表视图中在每个列表项前面都添加了一个复选框,通过使用这个复选框,我们能一次对多个选中的列表项进行操作。比如,同时删除多个列表项:

    clip_image020

    或是在文档库中同时签出多个文档:

    clip_image022

    SharePoint 2010的列表还新增了一种编辑模式:Inline Editing。只要在列表视图中启用Inline Editing,用户就能够直接在列表视图中点击列表项左侧的编辑图标,编辑当前列表项,然后再通过点击左侧的保存图标,快速完成列表项的编辑:

    clip_image024

    posted on 2009-11-04 02:17:13 by kaneboy  评论(11) 阅读(29758)

     
    2009年10月30日

    这个系列的文章,是为了帮助大家更好的了解SharePoint 2010。拥有SharePoint 2007的经验能够帮助您更容易的理解本系列的文章,但我会尽量使没有SharePoint 2007经验的读者也能不困难的进行阅读。

    下图是一张SharePoint 2010基本架构图,它简要的描述出了SharePoint 2010的基本结构。

    clip_image002

    当我们说“SharePoint 2010”时,实际上是包含了SharePoint Foundation 2010和SharePoint Server 2010这两个产品。SharePoint Foundation在之前的版本中,被称为Windows SharePoint Services(WSS)。SharePoint Foundation是SharePoint Server的基础构件,SharePoint Server依赖于SharePoint Foundation。我们可以在系统中仅安装SharePoint Foundation,而不安装SharePoint Server(比如,由于价格的原因),但是如果我们直接安装SharePoint Server,则会默认的安装上SharePoint Foundation。

    如果本文中没有明确的指出,那么SharePoint 2010默认包含了SharePoint Foundation 2010和SharePoint Server 2010。

    SharePoint 2010完全基于x64架构,且不再包含x86版本。这也就决定了SharePoint 2010所要求的硬件和软件环境:

    1. 1. 服务器硬件必须支持x64;
    2. 2. SharePoint 2010服务器的操作系统必须使用Windows Server 2008 x64或Windows Server 2008 R2 x64;
    3. 3. SharePoint 2010服务器所使用的数据库必须是SQL Server 2005 SP2 x64或SQL Server 2008 x64。

    如果您希望将现有的SharePoint 2007系统升级到SharePoint 2010,那么首先,必须将SharePoint 2007系统迁移至x64环境,包括硬件、操作系统和数据库,然后才能顺利的将SharePoint 2007升级到2010版本。

    为了方便SharePoint开发人员,SharePoint 2010提供了一种方式,允许开发人员将其安装到64位的Windows Vista和Windows 7操作系统之中。这样,开发人员可以在自己安装了Windows Vista或Windows 7的开发环境中,使用Visual Studio 2010进行SharePoint应用程序开发。(后续文章将详细介绍如何在Windows Vista和Windows 7上安装SharePoint 2010。)

    SharePoint是一个基于.NET/ASP.NET技术的Web应用平台。SharePoint 2010基于.NET Framework 3.5 SP1版本。没错,虽然SharePoint 2010的开发将主要使用Visual Studio 2010,但它使用并依赖于.NET 3.5 SP1,而并非.NET 4.0。

    Office 2010(在本系列文章中,“Office 2010”指Office 2010系列的客户端软件,如Word、Excel、SharePoint Designer等)与SharePoint 2010有了更好的集成性。这体现在:

    1. 1、 SharePoint Designer 2010功能更丰富,比如,它内置了更强大的工作流设计器,并且可以通过Business Connectivity Services直接连接到数据库;
    2. 2、 在Visio 2010中,可以直接设计SharePoint 2010工作流,然后将设计好的流程导出至SharePoint Designer 2010的工作流设计器;
    3. 3、 Groove 2007变成了SharePoint Workspace 2010,它现在可以将SharePoint网站中的文档库和列表数据,同步到客户端之中,以实现离线访问,同时允许用户在本地编辑文档库和列表数据,然后同步到SharePoint网站中。

    posted on 2009-10-30 14:21:07 by kaneboy  评论(7) 阅读(32299)

     
    2009年10月22日

    为了迎接SharePoint 2010,决定订购一台新笔记本,用来进行SharePoint 2010开发、测试和演示。我对新装备的要求是:

    1、轻便。由于我经常有机会进行演示和讲演(比如下个月即将开始的TechED China 2009),所以我希望这台新装备足够轻便,当我带着它外出时,不会让我感到太大的“压力”。
    2、足够的性能。由于我的开发环境基本上都是建立在虚拟机里面,所以我希望它可以轻松的运行SharePoint 2010虚拟机。

    最后我订购的是ThinkPad X200,它配置了酷睿2 P8600,6GB内存(单条4GB的笔记本内存太贵了,以后再升级到8GB吧),320G硬盘,而且,它还足够轻便。从昨天晚上拿到了它之后,就开始给它安装Windows Server 2008 R2,并使用它启动了一个SharePoint 2010的Hyper-V虚拟机。在为虚拟机分配了4.5GB内存之后,它运行得相当的流畅。:)

    1 

    新装备到手之际,同时也听到了某些同志准备订购ThinkPad T400,8GB RAM,2GB Intel Turbo Memory的传闻...

    posted on 2009-10-22 16:16:32 by kaneboy  评论(10) 阅读(29890)

     
    2009年10月20日

    从北京时间昨天晚上开始,随着SharePoint Conference 2009开幕,有关SharePoint 2010的NDA就结束了。这也就是说,无论是MVP,还是参加了SharePoint 2010 TAP的用户,都可以开始自由的在博客、论坛上撰写或讨论有关SharePoint 2010的内容。

    SharePoint Conference 2009的网站首页上,已经可以收看到会议第一天早上的Keynote视频。另外还有一些不错的视频也被放在了SharePoint Conference 2009会议网站上,比如SharePoint 2010 Customer Excitement

    刚刚上线的SharePoint 2010 Developer Center上面已经有了不少有价值的内容,比如2010 SDK。如果您是一名SharePoint Application Developer,那么SharePoint 2010 Developer's Evaluation Guide是一定要看的。如果你是一名SharePoint Administrator,那么也可以阅读SharePoint 2010 IT Pro's Evaluation Guide

    SharePoint 2010的公开测试版将在11月份发布。

    posted on 2009-10-20 19:54:02 by kaneboy  评论(0) 阅读(28868)

     
    2009年10月14日

    一年一度的TechED将在今年11月5日-7日,在北京国家会议中心登场。今年的TechED取消了上海和广州站(金融危机的原因?),而只保留了北京站。对于不少华东华南的朋友来说,这真是一件纠结的事啊...在本次TechED China 2009中,当然少不了有关于SharePoint的课程,而其中大部分,都是有关于SharePoint 2010的。这应该也将是国内第一次SharePoint 2010技术课程的集体出场。

    SharePoint 2010 新技术揭秘
    SharePoint 2010 系统管理员秘籍
    SharePoint 项目实施团队的成功之道
    SharePoint内容管理及合规一致性
    从隔靴搔痒到探囊取物 - SharePoint 2010数据访问新特性
    用Visual Studio 2010构建SharePoint 2010应用实战体验
    先睹为快 -- Office 2010全新生产力平台大揭秘
    将分散的信息汇聚为知识和价值 - SharePoint 2010企业搜索
    强强联手:Office 2010 与 SharePoint 2010协同办公
    SharePoint 2010 Business Connectivity Services:外部业务数据整合利器
    InfoPath 2010亮剑 -- 为SharePoint列表设计表单应用
    SharePoint 2010 与 Access 2010 构建团队级数据应用

    上面的课程中,粗体标注的是我主讲的课程。欢迎捧场!:)

    更多有关TechED China 2009的信息,请参考TechED网站。完整课程表请点击这里

    posted on 2009-10-14 00:53:58 by kaneboy  评论(2) 阅读(29994)

     
    2009年09月27日

    大约一年前,我曾经在blog上写过一篇文章,讲述了我对于SharePoint解决方案开发模型的一些想法,其中包括了SharePoint解决方案开发的方方面面,从开发团队,到开发环境的建立、物理与逻辑架构的设计、开发流程、信息架构、测试等等等等。这些主题我相信对于SharePoint开发人员、架构师、项目经理而言,都是非常有价值的。

    既然直到现在,国内仍然没有任何SharePoint开发书籍(当然也包括我的《SharePoint 2007 开发入门指南》)讲述上面这些主题,所以决定开始在自己的blog上面,陆续就每个主题,撰写一些文章。希望这些文章能帮助到SharePoint技术社区。

    每每涉及到比“具体”技术细节更高一层的架构、流程、方法论的东西,通常都很容易引起争议。这是很正常的现象。这些主题和具体的诸如C#语法、怎么做一个Web Part等等都不相同,因为这些主题根本就不会有一个标准答案。每个人心中都对如何设计一个架构、如何实施某个流程都有自己的想法,而环境与条件的不一致,更是使得所谓的“最佳实践”在很多场景中都不适用。所以,如果你对我撰写的文章中的某些内容不认可,没有关系,这些文章中的内容本来就不是“金科玉律”,甚至在你所处的场景中根本就是错误的。这些文章只代表我个人的意见(但其中肯定有不少想法,来自MSDN以及其他人所撰写的博客和文档),同时我也希望它们能成为交流的一个平台。如果你对文章中的内容有意见和想法,欢迎留言。高质量、有价值的留言,通常都能让后来的阅读者受益良多。

    任何软件项目的实施,都必须从实施团队开始。所以,首先要讲述的主题,是如何建立一个SharePoint实施团队。

    从本质上来说,实施一个SharePoint项目,与其他类型的软件项目,诸如ASP.NET、PHP,都不会有根本的差别。所以一个SharePoint实施团队的组成,也基本上和一个标准的Web项目实施团队相同。在下面的角色描述中,我基本上只会描述和SharePoint相关的部分,而其他通用的内容则会尽量省略。

    项目经理

    项目经理是整个项目的管理者。他负责指派任务、记录和跟踪进度、向老板们汇报...总之,项目经理的工作就是要保证整个项目处于正常状态,并能顺利完成。在小型团队中,项目经理有可能同时兼任业务分析人员。

    业务分析人员

    业务分析人员应当与客户充分交流,弄清楚客户的业务需求、流程等等信息(越详细越好)。业务分析人员与架构师一起工作,撰写出应用系统的功能规格说明书(也可能叫其他名字),不管我们叫这份文档什么名字,它都应当至少包含有:
    1、整个项目要解决的问题、目标
    示例:“ABC公司是一家卖汽车的企业,它总共有300名销售人员,销售人员希望通过一个“客户管理系统”对他们各自的客户进行管理。在这个系统中,销售人员能够查看自己负责的客户、每个客户的详细信息、每个客户的订单历史记录等信息。同时,销售人员还需要通过这个“客户管理系统”提交季度销售预测报告...”
    2、针对用户使用场景的User Cases
    这里的User Cases信息,应当详尽的描述出用户使用系统的每个具体场景,它将作为整个团队的一个“基础文档”,架构师和开发人员根据这些信息,才能知道程序最终要实现的效果。每个User Case里面都要包含用户几乎每个操作的描述和说明,以及每个主要界面的图示(使用Visio或其他工具绘制),也就是说,它不能含糊,而应该清晰、明确、有针对性。
    示例:“User Case 15 - 销售人员Dashboard”
    “销售人员在“客户管理系统”主页上点击“Dashboard”按钮(参考User Case 5),就能够打开自己的Dashboard...Dashboard会自动校验当前浏览用户的身份和权限,如果的Dashboard以两栏的方式来展现信息(参考图15-3),其中左栏自上而下会包含5个链接,分别是...销售人员点击了左栏的“历史订单数据”链接之后,页面将转向到“历史订单数据”页面(参考User Case 26)...中间的向右箭头是一个可以允许销售人员将右栏折叠起来的图标,在点击它之后...销售人员可以点击右上角的“返回”图标,以返回到“客户管理系统”主页...”

    功能规格说明书不涉及具体的技术细节,不包含如何实现每个场景的技术说明,不包含系统的设计内容。我们可以这样想象,假设团队中突然来了一个陌生人,他希望能了解这个团队到底在做一个什么项目,这个项目是干嘛的,实现了什么功能,我们可以将这份功能规格说明书给他,而他确实可以从这份文档中了解到他希望了解的这些信息。

    这份文档不能由业务分析人员一个人独自写成,而一定要有技术人员(以架构师为主)的共同参与。一方面,架构师的参与可以保证规格说明书中的内容,在技术上是可行且合理的,另一方面,也有助于架构师从业务角度了解系统,明白客户的需求。

    我个人对功能规格说明书的重要性非常推崇。在项目中,可能我们不会撰写详细的设计文档,可能我们不会撰写详细的部署文档,但一份详细的功能规格说明书确是不可缺少的。它的重要性体现在:
    1、让团队中的所有人都明白我们要构建的是一个什么东西。如果没有这样的一份清晰的功能规格说明书,就不能保证团队的所有人都一致了解团队的目标。如果没有它,业务分析人员会根据客户的描述,在自己的大脑中想象出系统应该有的样子,然后口述给开发人员,并假设开发人员完全明白了自己大脑中的想法,而开发人员则会根据自己从业务分析人员那里听到的,在自己的大脑中又试图去想象系统做出来应该是什么样子的,并假设这就是业务分析人员想要的样子...总之,每个人都会根据自己的“想象”,去猜测别人的意图。而最后当开发人员把最好的东西给业务分析人员演示的时候,通常是业务分析人员大吃一惊:“我kao,怎么是这个样子?这根本和我告诉你的是完全不一样的东东...”而开发人员则会辩解:“胡说,这分明就是我根据你告诉我的要求做出来的...”
    2、我们有了一个可以和客户讨论的东西。这份文档可以尽早的交给客户审阅,客户可以根据这份文档,了解到系统做出来会是什么样子,如果不满意,客户也可以及早的和开发团队进行沟通:“嗯,不对,在这个地方,其实我们更希望看到一个选择框,而不是用户自己填...”
    3、它是业务分析人员与开发人员之间的一份“合同”。业务分析人员可以充分的假定,开发人员最后交付的,就是功能规格文档中所描述的样子,而开发人员也可以充分的假定,业务分析人员需要的,也是文档中所描述的样子。

    值得一提的是,功能规格说明书并不会(也不应该)限制开发人员的“自由”。它仅仅包含对业务场景、系统功能的详细描述,但是不会写上应该如何实现。它肯定不会包含诸如“在这里,我们要创建XYZ类和ZYX类,前者用于从数据库中查询QWE表...”,也不会包含诸如“我们将使用3层结构,并由5个主要模块来构成整个系统框架...”之类的信息。如何设计、如何实现,应该由架构师和开发人员讨论并确定,而没有必要写到功能规格说明书里面。

    架构师

    架构师首先应当与业务分析人员一起撰写功能规格说明书,以保证其中所包含的内容在技术上的可行性,这同时也能保证架构师非常了解整个系统的业务需求。其次,架构师应该以功能规格说明书为基础,为整个系统设计物理架构和逻辑架构,将整个系统合理的拆分成各个更小的模块与组件,并将模块与组件的开发任务分配给开发人员。架构师还要与开发人员非常紧密的一起工作,与每位开发人员讨论并确定每个模块的实现方式。架构师应当是技术负责人,确保整个项目在技术上畅通无阻。

    系统物理架构也就是整个系统在物理上、网络上的拓扑模型。整个系统需要多少台服务器?每个服务器是什么角色?网络设置应该是怎样的?是否需要DMZ区域中也要部署一台SharePoint服务器(如果用户需要从Internet访问的话)?或是使用DMZ中ISA Server来进行Internet发布?这些设计都是属于系统物理架构上的设计。

    系统逻辑架构是从逻辑上描述整个系统的结构。整个系统有几个SharePoint服务器场?有几个SharePoint Web Application?几个Site Collection?每个Site Collection是做什么的?会包含哪些内容?为哪个群体的用户服务?各个不同区域的安全模型是怎样的?这些设计就属于系统逻辑架构设计。

    子模块与组件的拆分也是架构师需要承担的工作。如何将整个系统拆分成更小的模块与组件?按何种方式与原则进行拆分?比如,是按照传统的N层架构来拆分(将“数据层”模块交给一个开发人员做,将“业务逻辑层”模块交给一个开发人员做,将“UI层”模块交给一个开发人员做...)?还是按照业务功能来拆分(将“客户数据维护”功能模块交给一个开发人员做,将“订单历史数据查询”功能模块交给一个开发人员做,而每个功能模块实际包含了实现那个功能所需的所有从数据到业务逻辑到Web Part展现相关的所有部分...)?不同的拆分方式,就决定了如何为开发人员分配工作,并会影响到后续一系列的诸如集成测试之类的环节。

    开发人员

    终于,开发人员登场了。开发人员的工作就是理解自己所负责的模块与组件相关的业务需求,仔细阅读(并可能参与编写)功能规格说明书,与架构师紧密合作,将功能实现出来。

    作为一个SharePoint开发人员,是非常有挑战性的。需要学习和掌握的知识点非常的多,才可能从容不迫的将手头的开发任务完成。拥有强有力的SharePoint开发人员,是整个项目能否顺利完成的关键因素。

    SharePoint开发人员需要掌握的知识包括:SharePoint、ASP.NET、XML、Windows Workflow Foundation、JavaScript、InfoPath,未来还可能需要加上Windows Communication Foundation、LINQ、Silverlight、PowerShell...

    测试人员

    当我说到“测试人员”时,实际上包含了两类人。一类是对开发人员写出的代码进行测试的人,这种人可能由开发人员(通过贯彻Unit Test流程)兼任,第二类则是在SharePoint解决方案开发过程中,进行集成测试和最终环境测试的人,这种人也可以由某位开发人员兼任。

    集成测试是指,在一个独立的集成环境中(通常是一个“干净的”SharePoint服务器场),定期将所有开发人员交付的模块与组件部署进来,并对它们的功能以及它们相互之间的关联进行测试。一个集成测试环境对于SharePoint开发而言是必不可少的。

    网络与系统管理员

    网络与系统管理员是那些负责建立和管理开发团队所使用的各种环境的人。这些环境包括位于每个开发工作站上的开发环境,进行集成测试的集成服务器环境,进行部署前测试的最终测试环境,以及生产环境。网络和系统管理员负责将开发人员交付的模块与组件,部署到各个环境中(比如测试环境、生产环境)。将有了环境管理员,开发人员也可以快速的得到一个标准的SharePoint开发环境。网络与系统管理员可以由某位非常熟悉SharePoint管理的开发人员兼任。

    当然,根据各个项目需求的不同,团队中还可能有其他的角色存在,比如美工、文档编撰人员等。这些我们就不再一一详述了。本系列的下一篇文章,将讲述SharePoint解决方案开发中所涉及到的各个环境。

    posted on 2009-09-27 01:52:41 by kaneboy  评论(4) 阅读(31204)

     
    2009年09月24日

    这两天在忙着修饰自己部门的Team Site,老板提出了一个期望,想在Team Site首页上放一个Timeline,这样部门有什么新的事件、日程,都能在Timeline上展现出来。这件事本身并非特别麻烦,但是我们的Team Site是放在公司Hosting的SharePoint系统之中(公司提供SharePoint Hosting服务,每个人/部门可以根据自由要求,以自助的方式申请Site来使用),而公司Hosting的系统,是不允许各个网站的所有者使用任何Server Code(服务器端代码)的。从IT管理的角度来说,这也是非常合理的,但这的确大大限制了各个网站的使用者对各自的网站进行定制的能力。换句话说,我能使用的工具,只有SharePoint内置的各个Web Part,以及SharePoint Designer。(在SharePoint 2010中,提供了一个新的特性:Sandboxed Solution,来解决这个问题,各个网站集的管理员可以通过upload的方式,部署功能与权限受限的Solution Package到网站集之中,但又不会影响其他网站集和整个服务器场的安全与稳定。)

    在经过一番考虑之后,我确认在不允许服务器端代码的前提下,是可以通过JavaScript和HTML的能力,实现一个Timeline的。下面这张图是最终实现后的效果:
    image

    这个Timeline分成了3栏,从上至下分别是日、周、月视图,用户可以使用鼠标对每个栏进行滑动操作,以查看之前和之后日期的各个事件。Timeline中的事件,来自于网站中一个日历类别列表中的数据,这样网站使用者只用在列表中添加新的事件,Timeline中就会自动显示出来:
    image

    实现的关键是两点:
    1、使用JS从网站列表中,获取到所需的列表项数据;
    2、使用JS和HTML,在SharePoint页面上渲染出Timeline。

    首先,我在网站中使用“日历”列表模板,创建了一个新列表。由于在Timeline控件上,我只希望能够显示当天前后30天之内发生的事件,为了更容易的取到当天前后30天的事件列表项,我在列表中创建了一个新的视图,在这个视图中只显示事件开始时间是位于当天前后30天的事件。为什么创建这样的一个视图就能方便我们在页面上用JS获取想要的数据,看到后面大家就明白了。

    为了让这个新视图能进行查询过滤,我为列表创建了两个新的计算类型字段,"30DaysBeforeStartTime"和"30DaysAfterStartTime",下图显示了"30DaysBeforeStartTime"的定义方法:
    image

    "30DaysAfterStartTime"的定义方法也类似,只是公式变成了"=[Start Time]+30"。

    很多人都不知道在计算字段中,应该如何使用公式。在这个页面上,有能够使用的所有公式和函数的说明,这里还有一些最常用的公式的示范。

    有了这两个字段,我们就可以为新的视图来设置过滤条件了,通过下图中的条件,就能过滤出当天的前后30天之类的事件:
    image

    有了这个新的视图之后,我们就能保证,我们需要在Timeline中显示的数据,肯定都会被这个视图所包含。接下来我们进入到JS阶段...

    如果要用JS获取SharePoint网站中的数据,比较靠谱的方法是用JS调用SharePoint的Web Services接口。SharePoint提供了不少Web Services接口,让我们可以在各种平台和语言中调用,其中就包括运行在页面上的JS。我们需要的是能够从列表中获取数据的Web Services接口,这个接口位于Lists Web Service里面,它提供了一个GetListItems()方法,让我们拿到列表项数据。其中,GetListItems()方法的第二个参数:"viewName",就可以让我们指定列表的一个视图,作为取数据的筛选条件。当然,我们也可以使用GetListItems()方法后面的参数来重新指定筛选条件,但是通过列表视图来制定筛选条件,要简单很多,而且修改起来也容易得多。

    如何在JS中调用Web Services的方法在网络上能找到很多很多的文章,我就不再重复了。但我要推荐一个不错的JS库,使用这个JS库,可以免去手工构建SOAP包的麻烦,而且使用也相当的简捷。它包含许多的.js文件,将这些.js文件上载到网站的某个文档库中即可(实际上,并不一定需要复制所有的.js文件,比如,对于我的要求,我只用复制"SPAPI_Core.js"、"SPAPI_Types.js"和"SPAPI_Lists.js"即可)。我将所有这些乱七八糟的文件都放在一个名叫"SupportingFiles"的文档库中:
    image

    然后,用SharePoint Designer打开网站的母版页文件(默认是"default.master"),添加上对这几个.js文件的引用(图片上显示出还添加了对"http://simile.mit.edu/timeline/api/timeline-api.js"的引用,这个东东下面会讲到):
    image

    使用上面所介绍的那个JS库,下面所示的代码就可以让我从一个列表中,将列表项取出来:

    function getCalendarListItems()
    {
        var lists = new SPAPI_Lists("网站URL
    ");
        var items = lists.getListItems(
            "Timeline", // 要获取数据的列表的显示名称
            "{14CB7B04-46AA-421C-B6B2-C5FBEEBA9F5B}", // 视图的GUID,注意两边要加上大括号
            "", // 查询条件
            "", // 要返回的字段
            100, // 要返回的数据的最大行数
            "", // 查询选项
            null // 网站的GUID,null表示使用上面的SPAPI_Lists构造函数里面的网站URL所对应的网站
            );

        if (items.status == 200)
        {
            var rows = items.responseXML.getElementsByTagName("z:row");       
            return rows; // 如果获取数据成功,将所有数据放在一个数组中,然后返回
        }
        else
        {
            return null;
        }
    }

    通过JS拿到所需的日历事件数据之后,接下来,就是如何在页面上用HTML+JS渲染出一个Timeline。作为一个典型的ELC(Exist Library Caller),我首先想到的是到网上找找是否已经有人做过类似的东东,果然,在Google Code上就被我找到了一个,嘿嘿嘿...

    在这个名为SIMILE Widgets的工具集中,包含了一个用JS实现的Timeline。经过在文档中一阵乱翻,下面的JS代码就能够帮我实现想要的效果(第一行不是JS代码,而是JS代码里面会使用的一个div元素,Timeline就是通过它显示出来):

    <div id="my-timeline" style="height: 120px; border: 1px solid #aaa; font-size: 9pt"></div>

    var resizeTimerID = null;
    function onResize() {
        if (resizeTimerID == null) {
            resizeTimerID = window.setTimeout(function() {
                resizeTimerID = null;
                tl.layout();
            }, 500);
        }
    }
    window.onresize = onResize;

    function formatDateString(originDateStr)
    {
        var yearStr = originDateStr.substr(0, 4);
        var monthStr = originDateStr.substr(5, 2);
        var dayStr = originDateStr.substr(8, 2);       
        return monthStr + "/" + dayStr + "/" + yearStr + " " + originDateStr.substr(11);
    }

    function createTimeLineAndEvents()
    {
        var items = getCalendarListItems();
        if (items == null)
        {
            alert("cannot got items from list.");
            return;
        }
        var eventSource = new Timeline.DefaultEventSource();
        for (var i = 0; i < items.length; ++i)
        {
            var ows_EventDate = formatDateString(items[i].getAttribute("ows_EventDate"));
            var ows_EndDate = formatDateString(items[i].getAttribute("ows_EndDate"));
            var ows_Title = items[i].getAttribute("ows_Title");
            var ows_Location = items[i].getAttribute("ows_Location");       
            var eventDate = new Date(ows_EventDate);
            var endDate = new Date(ows_EndDate);
            var event = new Timeline.DefaultEventSource.Event(
                eventDate, //start
                endDate , //end
                eventDate, //latestStart
                endDate , //earliestEnd
                false, //instant
                ows_Title, //text
                ows_Location //description
            );
            eventSource.add(event);
        }

        var bandInfos = [
            Timeline.createBandInfo({
                trackGap:       0.2,
                width:          "60%",
                intervalUnit:   Timeline.DateTime.DAY,
                intervalPixels: 100,
                timeZone : 8,
                eventSource: eventSource
            }),
            Timeline.createBandInfo({
                showEventText:  false,
                trackHeight:    0.5,
                   trackGap:       0.2,
                width:          "25%",
                intervalUnit:   Timeline.DateTime.WEEK,
                intervalPixels: 150,
                timeZone : 8,
                eventSource: eventSource
            }),
            Timeline.createBandInfo({
                showEventText:  false,
                trackHeight:    0.5,
                   trackGap:       0.2,
                width:          "15%",
                intervalUnit:   Timeline.DateTime.MONTH,
                intervalPixels: 400,
                timeZone : 8,
                eventSource: eventSource
            })
          ];
          bandInfos[1].syncWith = 0;
        bandInfos[2].highlight = true;
        bandInfos[2].syncWith = 1;

        var timeLine = Timeline.create(document.getElementById("my-timeline"), bandInfos);
    }

    _spBodyOnLoadFunctionNames.push("createTimeLineAndEvents");

    唉,实在是有点长,本来不想全部贴出来,可想到也许有人要用的话,所以就...另外,别忘了在母版页里面,添加对"http://simile.mit.edu/timeline/api/timeline-api.js"的引用(如上面的截图所示)。

    把上面的这些JS代码(以及一个"div"标签)都放到一个单独的.htm文件中,然后在想要显示Timeline的页面上放一个内容编辑Web部件。通过设置内容编辑Web部件的属性,告诉Web部件从那个.htm文件中去拿要显示出来的HTML源码(这种方式能让我们直接使用SharePoint Designer编辑那个.htm文件中的HTML和JS源码,而不必使用内容编辑Web部件内置的那个笨拙编辑器):
    image 

    OK,完成。另外提一下,在SharePoint 2010中提供了专门的Client OM,它直接支持使用ECMAScript(标准名词解释:ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMA-262标准的实现和扩展。)来访问SharePoint。

    posted on 2009-09-24 23:38:26 by kaneboy  评论(3) 阅读(31574)

     
    【第1页/共12页,401条】
    首页
    前页
    1
    ...

    Powered by: Joycode.MVC引擎 0.5.2.0