RSS

Monthly Archives: 十二月 2009

SharePoint 2010新体验9 – 内容管理器(Content Organizer)

如果我们使用一个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 by on 2009/12/25 in 未分类

6 Comments

Tags:

SharePoint 2010 新体验8 – 内容类型集线器 (Content Type Hub)

在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 by on 2009/12/23 in 未分类

3 Comments

Tags:

SharePoint 2010 新体验7 – Managed Metadata (托管元数据)

在一个企业中,有时候需要一个专门的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 by on 2009/12/17 in 未分类

4 Comments

关于创建自定义Service Application的胡言乱语

p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin-top:0cm;
margin-right:0cm;
margin-bottom:10.0pt;
margin-left:0cm;
line-height:115%;
font-size:11.0pt;
font-family:”Calibri”,”sans-serif”;
}
p.MsoListParagraph
{margin-top:0cm;
margin-right:0cm;
margin-bottom:10.0pt;
margin-left:36.0pt;
line-height:115%;
font-size:11.0pt;
font-family:”Calibri”,”sans-serif”;
}
p.MsoListParagraphCxSpFirst
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:36.0pt;
margin-bottom:.0001pt;
line-height:115%;
font-size:11.0pt;
font-family:”Calibri”,”sans-serif”;
}
p.MsoListParagraphCxSpMiddle
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:36.0pt;
margin-bottom:.0001pt;
line-height:115%;
font-size:11.0pt;
font-family:”Calibri”,”sans-serif”;
}
p.MsoListParagraphCxSpLast
{margin-top:0cm;
margin-right:0cm;
margin-bottom:10.0pt;
margin-left:36.0pt;
line-height:115%;
font-size:11.0pt;
font-family:”Calibri”,”sans-serif”;
}

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

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 by on 2009/12/16 in 未分类

4 Comments

SharePoint 2010 新体验6 – 开发人员面板

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

在开发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 by on 2009/12/08 in 未分类

1 Comment

Tags:

SharePoint 2010 新体验5 – Office Web Applications

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 by on 2009/12/05 in 未分类

9 Comments

Tags:

SharePoint 2010 新体验4 – SharePoint Workspace

在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 by on 2009/12/05 in 未分类

5 Comments

Tags:

SharePoint 2010 新体验3 – 文档集

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

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

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

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

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

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

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

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

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

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

 

Posted by on 2009/12/05 in 未分类

2 Comments

Tags:

关于SharePoint 2010 Beta2的安装

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

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

 

Posted by on 2009/12/02 in 未分类

2 Comments

Tags:

SharePoint 2010 开发人员与IT专业人员学习指南

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

image

点击下载PDF文件

 

Posted by on 2009/12/01 in 未分类

2 Comments

Tags: