2014年9月8日,星期一

SharePoint / Office 365中基于JavaScript的配置

在这篇文章中,我想特别关注基于JavaScript的供应代码的思想–一种可能有用的方法,在每个现代SharePoint开发人员中都有一席之地’的工具包。这是使用SharePoint的想法’的JSOM API(即CSOM的JavaScript版本)来为SharePoint网站执行各种一次性配置步骤-最初,我对该技术(JavaScript?对于资源调配?是否可靠?)持某种怀疑态度,但是看到了一些团队-同事们在项目上成功使用了它(赞!),我认为’值得考虑。

背景

对于使用SharePoint Online / Office 365的SharePoint开发人员, 要么 正在内部部署,但选择不使用完全信任的WSP只是为了确保其解决方案是“cloud-friendly”,自定义SharePoint代码的先前选项不再可用。而且一些常见情况仍然需要代码–尤其是在开发某种形式的自定义网站模板时,或者我们正在努力实现网站的自动配置时。

开发人员可能需要使用代码的预配步骤的一些示例如下:

  • 绑定托管元数据/分类字段
  • 在网站上设置主题/组合外观
  • 设置网站的母版页
  • 修改导航设置
  • 品牌OneDrive(个人)网站
  • [可选]通过代码而不是XML设置字段和内容类型

当无法使用服务器端SharePoint代码时,这将带来挑战。众所周知,Microsoft已弃用沙盒SharePoint代码(我们以前可能使用过它称为功能接收器),并且将来可能会在Office 365中关闭此功能。因此,我们必须改用一种远程API–并且代码可以从其他服务器(例如.NET CSOM)或用户运行’s browser (JSOM).

远程代码选项

大致来说,远程代码的选项包括:

  1. .NET CSOM API的一些用法:
    1. 将代码部署到Azure等云服务,或在某处运行自己的服务器。这可能是“App for SharePoint”,也可以只是不使用应用程序身份验证的远程代码。
    2. A “PowerShell + CSOM” script 你写了
  2. JSOM API的某些用法(即CSOM的JavaScript版本)
  3. REST API的某些用法(来自JavaScript或远程服务器端代码)

正如微软所说,您的自定义代码要么需要向上移动到云中,要么向下移动到用户’s browser.

基于JavaScript(JSOM)的选项

最初,使用JSOM代码进行站点供应步骤的想法很奇怪。如果用户在代码运行时关闭浏览器,会发生什么?该网站是否将正确配置?如果用户在慢速连接上离服务器很远怎么办?像这样的问题最初使我感到怀疑,但是我认为有了一些保护措施和注意事项’s是一个有趣的远程代码选项。一世’一会儿再说说它是如何工作的,但首先在这里’s why I think it’s interesting:

避开“服务器端远程代码” issue

作为现代SharePoint开发人员,我’所有内置的应用程序和远程代码。在某些情况下’在Azure中实现了远程SharePoint代码(例如,请参阅 将SP2013提供程序托管的应用程序/远程事件接收器部署到Azure网站(用于Office 365应用程序) 发布)。是的,我’我很酷的东西!和我’我也和孩子们在一起 微软’的OfficeDev模式和实践示例,其中涵盖了很多情况,例如我上面列出的那些情况– they’有效地写了 wrapper around the .NET CSOM API calls, which make it 真实ly easy to get these tasks done.

但是仍然需要部署这种类型的代码! 本地服务器(例如某些IIS盒)会在高可用性,防火墙外部访问,SSL证书,备份和还原等方面带来复杂性。当然,也存在云选项。如果您(或您的客户端)已经在使用Azure,那就太棒了!它’在此处部署和运行代码确实不是很困难,Microsoft负责运营/ IT。上面列出的有利因素。但是在许多组织中’不幸的是,经过合作,Azure(或类似的云服务)尚未嵌入IT中。部门’的工具包。没有Azure订阅,有人在I.T.已经支付月度发票。并且有各种各样的可操作IT讨论话题并取得共识,然后我们才能升任该职位–谁负责,我们将在其中存储什么样的数据,谁可以访问,它如何与任何现有的SLA / OLA配合,由哪个部门/成本中心支付账单等。

有趣的是,在“实施伙伴”就像我的团队所做的那样,我们几乎可以选择为客户端向Azure部署一些远程代码,而无需让他们参与此决策。 Azure网站产品具有免费选项,因此可以避免所有帐单问题/设置。但是,在自由模式下您不会获得高可用性–因此,如果正在修补您运行代码的计算机,则您’会有停机时间。所以最后,除非您的代码很简单,否则这可能不是’t an option.

因此,在某些情况下,用JavaScript实现远程代码的想法可能很有吸引力。

基于JavaScript的配置的可靠实现

所以,我们’d需要某种方式使基于JavaScript的方法更可靠。伙计们使用的模式是这样的:

  • SharePoint网站已创建(也许是从自定义WebTemplate进行的,该WebTemplate负责处理XML中的某些设置)–此时,该站点尚未完全配置
  • 每个页面都引用了一个自定义JavaScript文件–这会检查设置步骤是否已经完成。如果不是,则用户’会检查其权限,以查看它们是否为网站所有者,以及我们是否可以继续(使用“网站所有者需要访问此网站才能对其进行配置”如果未显示该消息)。
  • 当用户访问该网站时,我们的代码就会运行。如果我们可以进行设置,则会显示一个对话框-“Please wait – we are 准备好您的网站”
  • 该代码开始执行配置步骤–可能会设置“组合外观”和/或自定义母版页,绑定分类法字段等
    • 每个步骤完成后,系统会将条目写入网络媒体资源包,例如“BrandingApplied = true”
  • 完成所有步骤后,将显示一条成功消息,并且“准备好您的网站”对话框自动关闭。该站点现在可以使用了。

可以猜到’仅当所有确认都写入到属性包时,我们才不再尝试执行这些步骤。这在实践中效果很好–用户/网站所有者很乐意看到此类消息,并且由于网站所有者是网站创建者,因此最初让网站所有者访问该网站通常效果很好。如果发生任何故障,那’也可以,因为未完成的步骤将在下一页加载时重试。

为了说明这一点,这里’是网站所有者在配置过程中可能会看到的内容(显示在测试页上,而不是“real” site home page):

对话框大

当然,您可以在外观和感觉上做得更好。

一些基于JavaScript的配置示例代码

In my other article Three 云友好 ways for developers to 在SharePoint / Office 365中配置托管元数据字段,我展示了一些JavaScript代码,它们执行了上述基本操作–专门用于将分类字段绑定到MM术语集。 这与其他文章中的示例相同 - 一世’为了方便起见,我在下面再次添加了该文章,但我建议您也阅读另一篇文章,因为它还有一些有关如何使用代码的注释(例如您可能希望通过JavaScript Promise进行增强的事实)。请注意 没有’t 可以在网络媒体资源包中处理设置确认信息,但是添加此信息非常简单。该代码将与Office 365或本地SharePoint一起使用:

我猜想从此代码中获取的主要东西是方法-在执行JSOM代码的几个步骤的同时显示对话框。在这个简单的示例中,当代码完成时,我们的分类字段将被绑定并可以使用–但是在我们的实际项目中,显然要执行更多的步骤。

概要

尽管使用JavaScript / JSOM代码进行配置的想法似乎很奇怪,但我相信它已经实现了’的位置,有时可能是正确的选择。当然,如果您不需要其他远程代码和/或没有托管位置(例如Azure或本地IIS服务器)可以投入生产,那么JSOM方法确实为您提供了一种运行方式远程SharePoint代码,而没有其他替代方法带来的麻烦。一如既往,考虑一下取舍并考虑一下’s right for you –但希望这里的信息对您有帮助。

Three 云友好 ways for developers to 在SharePoint / Office 365中配置托管元数据字段

调配托管元数据字段“the developer way”在无法使用SharePoint完全信任解决方案的情况下,会带来一些额外的复杂性,例如使用云友好技术的Office 365 / SharePoint Online部署或本地项目。过去,开发人员将使用功能接收器将分类法字段绑定到术语集– but this isn’在云场景中是不可能的。我以前在 调配托管元数据字段in Office 365 –在这里,我讨论了这个问题,并提供了一种方法’以前使用过,它确实可以在云中运行。如文章所示,’实际上,只要将与Office 365 / SharePoint实例相关的某些GUID插入XML中,就可以使用完全声明(基于XML)的方式来配置托管元数据字段。

声明式方法的缺点

本文还讨论了以下事实:如果您在多个环境(租用或本地)中工作,则XML中至少需要使用一个不同的GUID(用于术语库ID)。这有效地导致将不同的WSP程序包部署到不同的环境–当然,这在ALM方面不是很好!在我们的案例中,由于我们的TFS自动化构建过程处理了针对不同环境的构建包,因此我们对此取舍颇为满意,’感觉很难受。但是,如果没有自动化的构建过程,可能会遇到更多问题–现在更多的时间过去了,我认为’值得退后一步,讨论解决此常见问题的其他方法。

绑定分类法字段的3种方法

在深入探讨每个细节之前,请看以下是我看到的主要选项(N.B.’我在其他一些文章中使用了此列表):

  1. 100%声明式方法 (如上所述), 在我的另一篇文章中)
  2. 使用某种形式的远程服务器端 .NET CSOM代码:
    1. The 微软 sample in the Office开发人员模式和实践样本 (以前称为AMS样本)
    2. 您编写的一些自定义代码
    3. 一些习俗 “PowerShell + CSOM” script 你写了
  3. 使用 JSOM代码 在用户中运行’的浏览器,我在与此文章的配套文章中对此进行了讨论- SharePoint / Office 365中基于JavaScript的配置

值得注意的是,最后两个选择是’t 真实ly limited to “分类领域问题” –远程CSOM或JSOM方法都可以用作 更广泛的自动配置策略 即需要代码的所有设置步骤。 我通常需要在此处完成的事情的快速列表包括:

  • 绑定托管元数据/分类字段
  • 在网站上设置主题/组合外观
  • 设置网站的母版页
  • 修改导航设置
  • 品牌OneDrive(个人)网站
  • [可选]通过代码而不是XML设置字段和内容类型

因此,如果您在此列表中还有其他项目需要完成*或*,则您只希望避免由于ALM的折衷而对托管元数据字段使用声明式方法,那么您’我可能会在.NET CSOM或JSOM方法之间进行选择。对于.NET CSOM代码,Office Dev示例代码可以正常工作- 但是,当然,无论是否将其部署并托管在某个位置’像Azure或您自己的IIS服务器之类的云服务。这不是’对于生产级企业实施而言,一定很简单-“避开服务器端远程代码问题” section of SharePoint / Office 365中基于JavaScript的配置,我将详细讨论这场辩论。正如我在此处总结的那样:

在某些情况下,用JavaScript实现远程代码的想法可能很有吸引力。

而且,如果采取措施提高鲁棒性,我认为这种方法是可以的。因此,请记住’s看到JSOM代码中的置备托管元数据/分类字段是什么样的:

使用JSOM代码进行配置

下面的示例显示了代码,但是如果您’对使用它感兴趣的人也请参阅以下注释:

此代码示例的一些注意事项:

  • 该代码将与Office 365或本地SharePoint一起使用
  • 核心好处之一是该代码允许您指定术语集的名称,而不是它。’的ID。这很有用,因为此GUID在不同的环境中会有所不同,除非您 ’已采取具体步骤来避免这种情况发生(即通过以编程方式创建术语集)
  • 实际上,需要指定三件事–术语集的名称,术语集的语言环境以及字段的内部名称–您可以在我的代码顶部看到这些。最终,它们被传递给initTaxObjects()方法,该方法将启动该过程
  • I’通过不使用JavaScript许诺使代码保持简单,但是对于读者来说,这可能是一个练习。’d希望以此方式对其进行增强
  • 该方法当前设置为一次处理一个字段,但是可以扩展为接受字段名称/术语集ID的数组
  • 目前在那里’出于说明目的,插入了4秒的延迟–如果在生产环境中实现,请确保将其删除:)同样,您可以选择删除许多console.log行
  • 如果未在SharePoint页面中运行,则可能需要以不同方式处理脚本依赖项(例如,’重新编码正在应用中运行)
  • 在当前形式下,上面的代码期望某个调用代码在某处触发执行,并且ID为ID的DIV"jsomProvisioningMessage"(对于一些简单的日志消息)–您可以将它们都放在自定义Web部件中或将脚本编辑器Web部件添加到页面中。这是代码:

    <div id="jsomProvisioningMessage" />
    <script type="text/javascript">
    $(document).ready(function(){ 
     window.COB.JsomProvisioning.execute();
    }); 
    </script>

无论’使用此方法或替代方法,如果成功,则分类字段应如下所示(显示之前和之后):

之前(未绑定):

绑定之前的分类字段

之后(现在已绑定字段,可用于标记):

绑定后的分类字段

概要

托管元数据/分类法字段一直给开发人员带来麻烦,因为该字段和术语集之间需要关联,并且它们在不同的环境/租期中具有不同的ID。–因此通常需要对其进行动态查找/指定。假设我们通过自动配置以开发人员的方式实现站点,则可以使用.NET CSOM代码或JSOM代码以声明方式(通过ALM权衡)100%完成。在这篇文章中,我’我专注于JSOM方法–因为如果您对远程代码没有其他要求(因此也没有Azure订阅准备就绪),则此方法可能很有吸引力。