在SharePoint 2013之前,我们都习惯了在SharePoint服务器上运行自定义代码的想法。但是,这随SP2013改变–Microsoft强迫我们(Office 365)或指导我们(本地)运行此类代码 关 SharePoint框。你会明白为什么–坦率地说,如果每个人都有,Microsoft将无法提供稳定的Office 365 / SharePoint Online平台’在其上运行的自定义代码。因此,SharePoint 2013允许事件接收器代码在 远程 服务器。这篇文章着眼于将远程事件接收器组件部署到Office 365中运行的SharePoint网站的Azure网站。 由于RER在SharePoint 2013中采用提供商提供的应用程序的形式,因此我在此处编写的所有内容也适用于提供商提供的应用程序。 要对本地场实现相同的操作(对代码和配置步骤进行更改), 除非您已将该环境配置为信任ACS。在我们潜水之前,这里’s在我们整个应用程序系列中的位置:
- SharePoint 2013应用–架构,功能和UX注意事项
- 入门–在SharePoint应用程序中创建列表,内容类型,字段等(配置)
- 在应用程序网络中使用数据以及为什么要这样做
- 从SharePoint 2013应用访问最终用户数据(在宿主网站中)
- 将SharePoint 2013应用推广到企业-租户范围和PowerShell安装
- Azure是新的SharePoint‘_layouts’ directory
- “Host web apps” –将文件(例如母版页)设置到主机网站
- “Host web apps” –设置字段和内容类型
- Deploying SP2013 provider-hosted apps/Remote Event Receivers to Azure网站 (for Office 365 apps) [本文]
- 在SharePoint应用程序中使用Web部件
为什么将这些内容部署到Azure?
我认为,SharePoint远程代码(例如某些提供商托管的应用,远程事件接收器等)的一个不错的选择是将该代码托管在“Azure Websites” 关ering (*update 可能 2015 - Azure网站 are now 已知的 as "Azure Web Apps"*)。这很引人注目,因为它’免费,快速且易于旋转,而您却没有’无需提供任何内部服务器(所需的高可用性,可伸缩性,备份/还原和性能工作)。另一个重要因素是你不’不需要让您的网关/网络团队参与网站的建设(该网站托管着您的提供商托管的应用程序页面和/或用于远程事件接收器的WCF服务) 发布(当然在SSL上)并且可以从外部访问 -例如通过UAG或任何外围设备。 Azure已经在您的防火墙之外,并且当然可以通过Internet和Azure网站访问/寻址 在默认域(* .azurewebsites.net)上具有自动SSL支持。如果您想改用自定义DNS主机名(例如code.MyCompany.com),则也可以执行此操作,但需要执行一些额外的步骤。 In general, using Azure网站 is a great way to sidestep many of the infrastructure roadblocks which can derail you.如何将我的应用程序/ RER构建为自动托管的应用程序?
* 2015年初更新-Office 365中不再提供自动托管的应用程序!*It’这是一个公平的问题,因为Office 365不仅会自动托管应用程序“just work”, but in fact they actually run on Azure网站 underneath. 那么,为什么不这样做呢?好吧,这非常适合演示和概念验证代码。但是我个人不会’向客户推荐此架构以进行生产时感到不自在,并且 我注意到其他人也有同样的感觉。坦白说太多了“black box”继续使用自动托管的应用– there aren’目前几乎没有任何旋钮和转盘,而且技术细节很少(例如,比例尺限制,放大的可能性)。此外,任何为商店构建应用程序的人都会注意到,自动托管的应用程序无法在该处出售,因此’目前尚不清楚它们是否会在将来出现。
So, I prefer the more manual approach of deploying to Azure网站 myself. The benefits I get are:
- I can scale up from Azure网站 (shared) to reserved hardware (e.g. if my app is more heavily used, or uses more processor/memory than anticipated)
- 我可以使用Azure’s AutoScale功能(当前处于预览状态)可根据我设置的规则(例如处理器阈值)自动执行此操作
- 我对我的应用程序有更好的监控
- 我可以对应用程序的Azure片段进行更改,而无需重新部署SharePoint片段
- 我可以通过许多不同的方式发布(例如,FTP,WebDeploy,从TFS进行连续部署,git等)
- 我可以通过打开FTP客户端来检查Azure中的文件以进行故障排除
我的O365 / SP2013排列如何适合本文?我还应该考虑什么?
排列 | 考虑 |
Office 365 + app in Azure网站 | 本文重点。 如上所述,它与自动托管的应用程序非常相似,但具有更多的控制权。 |
On-premises + app in Azure网站 | 您’d需要对此处讨论的代码/过程进行一些更改。实际上,您需要配置高信任度/ S2S身份验证(而不是ACS的OAuth),并确保您’重新使用正确的TokenHelper方法或等效的自定义代码。 S2S的替代品可能是 即时认证. |
本地服务器中的Office 365 +应用 | 之所以具有吸引力,是因为它可以轻松地与其他本地应用程序/数据集成。但是,由于操作IT,通常会更加复杂上面列出的挑战。可使用Azure 服务巴士,BCS之类的技术解决,或者通过从本地到Internet / DMZ的自定义服务(例如WCF)公开数据。 |
本地服务器中的本地+应用 | 非常简单,因为一切都在防火墙后面。需要S2S身份验证配置或 即时认证. |
这可能是什么样的代码?
SharePoint 2013 / Office 365中的此类远程代码示例如下: - 远程事件接收器
- 列出事件(例如ListAdding)
- ListItem事件
- 网络活动
- 应用事件
- AppInstalling / AppInstalled
- AppUpgrading / AppUpgradeed
- AppUninstalling / AppUninstalled
- 其他应用程式码–即由提供商托管的应用中的全部功能
你需要什么– a summary
尽管简单的F5部署将在开发过程中照顾很多方面,但为了正确打包/部署应用程序以使其“实际使用”,以下是您需要的一些关键事项:- A website to be created on Azure网站
- 使用远程事件接收器的解决方案– 首次执行此操作时,建议您使用保证工作正常的代码,而不要使用您自己的代码(以免弄错代码和/或RER声明)。我用了 MSDN上的BasicDataOperations SP2013提供程序托管的应用程序
- 在您的SP2013环境或Office租约上向AppRegNew.aspx注册该应用程序–这将创建一个新的应用程序主体“known” to the environment.
- 在应用内:
- 应用中的所有URL引用都将更新为指向您Azure网站的绝对URL,例如:
- 远程事件接收器的声明
- AppManifest.xml等中列出的应用程序起始页。
- AppManifest.xml的AppPrincipal部分中列出的远程Web应用程序的ID(即App ID)
- 应用中的所有URL引用都将更新为指向您Azure网站的绝对URL,例如:
- 对于代表远程网站(而不是应用程序本身)的Visual Studio项目:
- 使用ClientId和ClientSecret更新的web.config (请注意,在Azure中,还可以在Web应用程序配置中指定AppSettings值,作为web.config的替代方法。下面的步骤使用此方法)
- 它将发布到您的Azure网站–有很多选项,但是我喜欢WebDeploy(如下所示)
详细过程
这里’是整个过程的详细说明-我’尽管我确实指出了一些事情,但我非常关注这里的基础结构/配置而不是代码。- 创建或获取您的解决方案。与任何带有远程组件的SharePoint应用程序一样, 基本数据操作 应用程式I’在使用中,有两个Visual Studio项目:
- 一个用于SharePoint应用程序
- 一个用于远程组件(即,这是ASP.NET网站,托管用于Remote Event Receiver的Web服务)
- 使用AppRegNew.aspx(即可以在/_layouts/15/appregnew.aspx上找到的页面)注册您的应用,并记下应用ID和应用秘诀:
- 在以下位置创建您的Azure网站 Azure管理门户 –记下URL。就我而言,这是 //cobspdev.azurewebsites.net
- 更新SharePoint应用程序项目,以便URL引用指向此Azure网站:
- 还要确保AppManifest.xml的SharePoint AppPrincipal部分列出了RemoteWebApplication,其中ClientId属性设置为App ID(来自应用程序注册):
** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 ** - [可选]如果要调试远程代码,则应在Azure上设置Service Bus实例,并使用它配置SharePoint应用程序项目(* 2015年更新-不再需要此步骤-Azure Web Apps中的远程调试现在无需服务总线配置即可进行*):
- 转到“Service Bus”Azure管理门户中的“区域”,并为此应用程序创建一个新的命名空间:
- 然后点击“连接信息”此名称空间并查看详细信息–复制连接字符串:
- 最后,在Visual Studio中,转到应用程序项目(而不是Web项目)的项目属性。转到“ SharePoint”选项卡,然后滚动到底部– ensure “启用远程事件调试”选中,然后将服务总线连接字符串粘贴到文本框中:
如果您需要更多相关信息,请参阅 更新以使用Visual Studio 2012调试SharePoint 2013远程事件.
- 转到“Service Bus”Azure管理门户中的“区域”,并为此应用程序创建一个新的命名空间:
- 发布 the ASP.NET website to Azure – I’m在此处使用WebDeploy(* 2015年更新-注意,如果您安装了Azure SDK,则要比这简单得多-单击VS中的“发布...”按钮后,用于Azure订阅的Web应用程序将被列为目标。请注意,如果尚未登录,则需要从VS登录到Azure *):
- 如前所述,可以像往常一样在web.config文件中或在Azure中的Web应用程序属性中指定Azure Web Apps AppSettings。通常,您会使用前者,但是为了说明Azure中的机制,该选项如下所示-您将转到Azure门户 并选择您的网站。请点击 配置,然后向下滚动到AppSettings部分–在此处输入ClientId和ClientSecret:
- 发布 the SharePoint app to Office 365 (by first publishing to the filesystem):
您’将显示一个类似于以下内容的对话框(* 2015年更新-在更高版本的Visual Studio工具中不再在此处指定“客户端机密”。只需确保该应用在AppSettings中是正确的*)–确保网址和客户ID为 正确指定,这些值将正确打包到应用清单中
- 此时,该应用程序已准备就绪,可以添加到Office 365租约中的“应用程序目录”中。转到 “Apps for SharePoint”关联的App Catalog网站中的库,然后按常规上传.app文件,或将其拖入:
- 现在可以将应用程序添加到网站:
- 一旦许可请求被接受,就可以安装该应用并运行它。通过在“网站内容”页面中单击来输入应用程序:

当然,要点是您现在正在运行远程代码,并具有托管它的位置。
概要
在必须运行代码的情况下“off-box”对于SharePoint(例如Office 365),Azure Web Apps可以提供比本地IIS服务器更轻松的方法。您可以使用Azure’可以灵活地从免费选项(非弹性)扩展到可提供生产级运营水平的付费选项之一。您 have to consider if you are happy for your code to run there and who might "own" the use of Azure within your organization, and 也许 诸如身份验证/与本地系统集成之类的一些考虑因素可能会为您排除这种情况。否则,它可以使您免于处理许多基础结构方面的问题(尤其是使网站在外部发布),因此该工具箱中的工具非常有用。