2013年7月12日,星期五

Deploying SP2013 provider-hosted apps/Remote Event Receivers to Azure网站 (for Office 365 apps)

在SharePoint 2013之前,我们都习惯了在SharePoint服务器上运行自定义代码的想法。但是,这随SP2013改变–Microsoft强迫我们(Office 365)或指导我们(本地)运行此类代码 SharePoint框。你会明白为什么–坦率地说,如果每个人都有,Microsoft将无法提供稳定的Office 365 / SharePoint Online平台’在其上运行的自定义代码。因此,SharePoint 2013允许事件接收器代码在 远程 服务器。这篇文章着眼于将远程事件接收器组件部署到Office 365中运行的SharePoint网站的Azure网站。 由于RER在SharePoint 2013中采用提供商提供的应用程序的形式,因此我在此处编写的所有内容也适用于提供商提供的应用程序。 要对本地场实现相同的操作(对代码和配置步骤进行更改), 除非您已将该环境配置为信任ACS。在我们潜水之前,这里’s在我们整个应用程序系列中的位置:

  1. SharePoint 2013应用–架构,功能和UX注意事项
  2. 入门–在SharePoint应用程序中创建列表,内容类型,字段等(配置)
  3. 在应用程序网络中使用数据以及为什么要这样做
  4. 从SharePoint 2013应用访问最终用户数据(在宿主网站中)
  5. 将SharePoint 2013应用推广到企业-租户范围和PowerShell安装
  6. Azure是新的SharePoint‘_layouts’ directory
  7. “Host web apps” –将文件(例如母版页)设置到主机网站
  8. “Host web apps” –设置字段和内容类型
  9. Deploying SP2013 provider-hosted apps/Remote Event Receivers to Azure网站 (for Office 365 apps) [本文]
  10. 在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)
  • 对于代表远程网站(而不是应用程序本身)的Visual Studio项目:
    • 使用ClientId和ClientSecret更新的web.config (请注意,在Azure中,还可以在Web应用程序配置中指定AppSettings值,作为web.config的替代方法。下面的步骤使用此方法)
    • 它将发布到您的Azure网站–有很多选项,但是我喜欢WebDeploy(如下所示)

详细过程

这里’是整个过程的详细说明-我’尽管我确实指出了一些事情,但我非常关注这里的基础结构/配置而不是代码。
  1. 创建或获取您的解决方案。与任何带有远程组件的SharePoint应用程序一样, 基本数据操作 应用程式I’在使用中,有两个Visual Studio项目:
    1. 一个用于SharePoint应用程序
    2. 一个用于远程组件(即,这是ASP.NET网站,托管用于Remote Event Receiver的Web服务)
  2. 使用AppRegNew.aspx(即可以在/_layouts/15/appregnew.aspx上找到的页面)注册您的应用,并记下应用ID和应用秘诀:

    AppRegNew
    AppRegNew确认
  3. 在以下位置创建您的Azure网站 Azure管理门户 –记下URL。就我而言,这是 //cobspdev.azurewebsites.net
  4. 更新SharePoint应用程序项目,以便URL引用指向此Azure网站:
    1. RER声明应如下所示:
      ** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **
    2. AppManifest.xml应该看起来像这样:
      ** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **


      请注意,打包应用程序时,Visual Studio将替换“〜remoteAppUrl”令牌-出现一个对话框,询问您将在何处托管远程Web应用程序,并且您在文本框中输入的值(例如,Azure中的URL)使用。

  5. 还要确保AppManifest.xml的SharePoint AppPrincipal部分列出了RemoteWebApplication,其中ClientId属性设置为App ID(来自应用程序注册):
    ** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **
  6. [可选]如果要调试远程代码,则应在Azure上设置Service Bus实例,并使用它配置SharePoint应用程序项目(* 2015年更新-不再需要此步骤-Azure Web Apps中的远程调试现在无需服务总线配置即可进行*):
    1. 转到“Service Bus”Azure管理门户中的“区域”,并为此应用程序创建一个新的命名空间:
      应用程序调试-Azure中的服务总线 
    2. 然后点击“连接信息”此名称空间并查看详细信息–复制连接字符串:
      应用程序调试-服务总线连接字符串
    3. 最后,在Visual Studio中,转到应用程序项目(而不是Web项目)的项目属性。转到“ SharePoint”选项卡,然后滚动到底部– ensure “启用远程事件调试”选中,然后将服务总线连接字符串粘贴到文本框中:
      应用程序调试-配置VS项目
      如果您需要更多相关信息,请参阅 更新以使用Visual Studio 2012调试SharePoint 2013远程事件.

  7. 发布 the ASP.NET website to Azure – I’m在此处使用WebDeploy(* 2015年更新-注意,如果您安装了Azure SDK,则事情要比这简单得多-单击VS中的“发布...”按钮后,用于Azure订阅的Web应用程序将被列为目标。请注意,如果尚未登录,则需要从VS登录到Azure *):
    1. Download the 发布 Profile for your Azure Website:

      下载发布个人资料
      下载发布个人资料-保存 
    2. 发布 the app – importing the 发布 Profile since this is the first time:
      发布 web app
      发布 web app - import   
      发布 web app - import - select file

      发布 web app - validate settings 
    3. 一旦验证了“发布配置文件”中的设置(如上图所示),请单击“Publish” to deploy to your Azure site. 您 should then see a success message:

      发布 web app - publish success
      现在,远程组件已部署到Azure。

  8. 如前所述,可以像往常一样在web.config文件中或在Azure中的Web应用程序属性中指定Azure Web Apps AppSettings。通常,您会使用前者,但是为了说明Azure中的机制,该选项如下所示-您将转到Azure门户 并选择您的网站。请点击 配置,然后向下滚动到AppSettings部分–在此处输入ClientId和ClientSecret:

    Azure-应用程序设置  
  9. 发布 the SharePoint app to Office 365 (by first publishing to the filesystem):

    发布 app 
    您’将显示一个类似于以下内容的对话框(* 2015年更新-在更高版本的Visual Studio工具中不再在此处指定“客户端机密”。只需确保该应用在AppSettings中是正确的*)–确保网址和客户ID为 正确指定,这些值将正确打包到应用清单中

    发布 app - enter settings

    发布 app - files generated 

  10. 此时,该应用程序已准备就绪,可以添加到Office 365租约中的“应用程序目录”中。转到  “Apps for SharePoint”关联的App Catalog网站中的库,然后按常规上传.app文件,或将其拖入:

    发布 app - upload to app catalog
  11. 现在可以将应用程序添加到网站:

    应用安装-现场
  12. 一旦许可请求被接受,就可以安装该应用并运行它。通过在“网站内容”页面中单击来输入应用程序:

    应用程式-网站内
..并且在您的Azure站点中运行BasicDataOperations MSDN示例应用程序’忍者CSS和响应式设计的荣耀:

基本数据操作
当然,要点是您现在正在运行远程代码,并具有托管它的位置。

概要

在必须运行代码的情况下“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 也许 诸如身份验证/与本地系统集成之类的一些考虑因素可能会为您排除这种情况。否则,它可以使您免于处理许多基础结构方面的问题(尤其是使网站在外部发布),因此该工具箱中的工具非常有用。

11条评论:

丹尼斯 said...

"忍者CSS和响应式设计的荣耀" :-)

很棒的文章,谢谢!我得到的最好的信息是通过Service Bus进行远程事件调试。那是一些疯狂的技术。

克里斯·奥'Brien说过...

@丹尼斯

是的,同意-它'当您想到那里的机制时,真是太不可思议了! Azure和SharePoint产品组的荣誉:)

C。

奈杰尔·普莱斯(Nigel Price) said...

克里斯你好
您 say Azure is 'free'是在生产环境中还是在开发环境中?

我以为您现在就在Azure上受到了收费。

问候

奈杰尔

克里斯·奥'Brien说过...

@奈杰尔

Azure网站 is 自由. For more details on Azure options, see Windows Azure执行模型.

干杯,

C。

马哈茂德·哈默德(Mahmoud Hamed)说过...

克里斯,你好

很棒的文章。

问候,
马哈茂德

未知说过...

当我尝试将应用添加到网站时,它赢了't let me - there'警告框阅读"抱歉,您的服务器不支持该应用程序。" I'm not sure what I've done wrong

未知说过...

啊,让它工作了。我已将博客文章中的AppPermissionRequests元素复制到清单中。再次将其删除,即可正常工作...

未知说过...

很棒的文章。

我们可以为不同的提供商托管的应用程序使用相同的客户端ID和密码吗?

或每次我们需要为每个应用程序创建一个不同的站点以基于客户端ID进行身份验证时。

因为我无法在azure中在创建的站点中放置多个客户机ID和机密。 ?>>>>>>

克里斯·奥'Brien说过...

@桑杰,

不,我'我很确定这赢了'工作。一方面,我不'不要相信您可以使用相同的应用程序ID(在AppRegNew.aspx或“商店”应用程序的卖方仪表板)中注册两个应用程序。

另外,请注意,每次应用注册时,重定向URI都必须不同。

HTH,

克里斯。

埃斯特万说过...

克里斯你好

我在尝试通过azure服务总线调试RER时遇到了很大的问题,当我查看您的屏幕快照以记下连接字符串时,它对我而言有所不同(也许他们更新了UI)。

http://screencast.com/t/vTzViiq4

如果我使用该连接字符串(SAS),则调试不起作用,我会收到以下类型的错误:
http://sharepoint.stackexchange.com/questions/113850/there-was-no-endpoint-listening-at-service-bus-for-sharepoint-app-cannot-re

当我在这里查看一些文档时:
http://msdn.microsoft.com/en-us/library/azure/dn170478.aspx

它说:例如,如果您创建一个名为contoso.servicebus.windows.net的服务总线名称空间,则会自动提供一个名为contoso-sb.accesscontrol.windows.net的配套ACS名称空间。对于2014年8月之前创建的所有名称空间,都会创建一个随附的ACS名称空间。

任何想法如何在2014年8月之后创建它?


谢谢

拉吉·奇南(Raji Chinnam)说过...

克里斯你好,

博客和文章给您留下了深刻的印象。但是我无法在iPad上正确访问您的网站,因为我可以将大部分时间用于阅读您的博客。

您 may be need to implement Bootstrap responsive design :)