本主题介绍了 SharePoint 中沙盒解决方案系统的体系结构。
包括打包系统、处理模型、分页呈现系统、资源使用率限制、代码执行和访问限制以及解决方案验证框架的说明。可在 SDK 的 沙盒解决方案节点中的其他主题中找到有关所有这些主题的详细信息。
与场解决方案相比,沙盒解决方案允许网站集管理员在没有更高级别的管理员参与的情况下,在 Microsoft SharePoint Foundation 中安装自定义解决方案。但是,若要实现此自由度,必须将沙盒解决方案限于管理员可部署的内容、可执行的代码以及可访问的资源。
注释 |
---|
有时会使用术语“用户”来代替“沙盒”,尤其是在沙盒解决方案系统的对象模型中。例如,具有系统的主 API 的命名空间为 Microsoft.SharePoint.UserCode,控制沙盒解决方案执行的服务在前端 Web 服务器上的 Windows“服务”对话框中称作“SharePoint 2010 用户代码主机”。(在管理中心应用程序中,该服务称作“SharePoint Foundation 沙盒代码服务”。)这反映了现称作“沙盒解决方案”的项目的以前名称。 |
与场解决方案类似,将沙盒解决方案打包以便在解决方案包 (.wsp) 文件中进行安装。但是,网站集管理员会将沙盒解决方案部署到特定网站集的“解决方案库”中,而不是将其部署到服务器场的解决方案存储区中。该库是一个特殊的 SharePoint 列表,它位于内容数据库中。通过网站集的“网站操作”UI 或使用 SharePoint Management Shell 将解决方案部署到该库。有关沙盒解决方案的安装过程的详细信息,请参阅 安装、卸载和升级沙盒解决方案。
对于沙盒解决方案中可包含的元素种类以及可将这些元素部署到的位置存在一些限制。最重要的是,无法从沙盒解决方案将任何内容部署到服务器的文件系统。此限制具有以下含义:
-
无法使用沙盒解决方案部署应用程序页、用户控件(.ascx文件)和本地化资源 (.resx) 文件。(但是,可通过其他方式本地化沙盒解决方案。有关详细信息,请参阅 沙盒解决方案的本地化。)
-
将沙盒解决方案中的图像、脚本文件和功能部署到内容数据库,而不是部署到前端服务器的文件系统。
-
无法在沙盒解决方案中部署网站定义。(但可在沙盒解决方案中部署具有等效功能的 Web 模板。)有关详细信息,请参阅How to: Deploy a Web Template in a Sandboxed Solution。
-
沙盒解决方案中的程序集也将部署到内容数据库,不过在使用这些程序集时,它们会临时缓存到处理请求的服务器的文件系统。有关详细信息,请参阅 沙盒解决方案中的程序集部署在何处?。
有关可在沙盒解决方案中部署的内容的完整说明,请参阅 可以在沙盒解决方案中实现哪些内容。
也不允许沙盒解决方案访问其部署到的网站集外部的任何内容。这表示,沙盒解决方案中部署的功能的范围限于网站集或网站。
SharePoint 是一个 ASP.NET 应用程序,它与 ASP.NET 应用程序类似,当前端 Web 服务器收到某个 HTTP 请求时,特殊的驱动程序(即HTTP.SYS)将检测该请求,并将其路由到处理目标 IIS 网站和目标 SharePoint Web 应用程序的请求的应用程序池。每个应用程序池均有一个 IIS 工作进程 (w3wp.exe),在该进程中,将执行每个请求的请求管道。(有关 IIS 7.0 工作进程和应用程序池的详细信息,请参阅 IIS 7 体系结构简介(该链接可能指向英文页面)。)在 SharePoint 服务器上,IIS 工作进程在应用程序池帐户下运行。这通常是服务器场帐户,因此该进程具有 SharePoint 资源的读写权限。在多服务器服务器场上,服务器场帐户通常是域用户。该帐户是访问内容数据库的同一帐户。SharePoint 2010 定时服务在同一帐户的上下文中执行。
与任何 ASP.NET 应用程序一样,场解决方案在 IIS 工作进程中运行,而沙盒解决方案却在具有特殊限制的执行环境中运行。这对于阻止未授权或性能不佳的代码减慢应用程序池的速度或导致应用程序池发生崩溃很重要。因此,SharePoint 将对可在沙盒解决方案中执行的代码施加限制。作为此系统的实现的关键部分,沙盒解决方案必须在特殊沙盒工作进程 (SPUCWorkerProcess.exe) 中运行。
当请求尝试访问沙盒解决方案时,IIS 工作进程中运行的 SharePoint 执行管理器将查找沙盒解决方案的代码将在其中运行的沙盒工作进程(如果未运行任何沙盒工作进程,则启动一个沙盒工作进程)。一般而言,可在运行 SharePoint Foundation 沙盒代码服务 (SPUCHostService.exe) 的服务器场中的任何服务器上启动此沙盒工作进程。在 Windows“服务”对话框中,它称作“SharePoint 2010 用户代码主机”服务。
运行 SharePoint Foundation 沙盒代码服务的服务器可以是(但并不一定是)运行 IIS 工作进程的前端 Web 服务器。可在管理中心应用程序内配置要使用的服务器:管理员可选择在“本地模式”中运行每个沙盒进程,这意味着将在运行 IIS 工作进程的同一前端 Web 服务器上处理对沙盒解决方案的每个请求;或者,管理员可让执行管理器在“远程模式”(有时称作“相似性模式”)中启动每个沙盒进程。在后一种模式中,执行管理器将查找运行 SharePoint Foundation 沙盒代码服务的服务器,该服务器已在其SPUCWorkerProcess.exe进程内为相同的沙盒解决方案创建了一个应用程序域。(如果其他网站集的另一个用户之前已请求该相同的沙盒解决方案,则将出现此情况)。如果存在一个匹配的应用程序域,则会将请求发送到相同的应用程序域以进行处理。如果运行 SharePoint Foundation 沙盒代码服务的任何服务器都不具有沙盒解决方案的应用程序域,则执行管理器会将请求分配给这些服务器中最闲的服务器。之后,该服务器将创建所需的应用程序域并处理对沙盒解决方案的请求。不管使用的是“本地模式”还是“相似性模式”,沙盒工作进程中的应用程序域都将在处理完请求后保持活动状态,且如果存在对相同沙盒解决方案的其他请求,则将重用该应用程序域。
由给定服务器处理的所有沙盒解决方案都在相同的沙盒工作进程中运行。每个沙盒解决方案会在常规进程中获取其自己的应用程序域。SharePoint Foundation 沙盒代码服务在服务器场帐户下运行。
此沙盒工作进程中运行的所有代码受执行和访问约束的限制。有两个约束体系:一个约束体系仅适用于沙盒解决方案中的代码对主 SharePoint Foundation 程序集(即Microsoft.SharePoint.dll)的调用。另一个约束体系适用于所有其他 调用,包括对所有其他 SharePoint 程序集和 .NET Framework 程序集的调用。在本主题中,第一个体系称作“服务器端对象模型约束”,第二个体系称作“一般约束”。(此外,还有一些由沙盒解决方案中使用的分页呈现系统产生的杂项约束。有关详细信息,请参阅下面的分页呈现系统一节。
注释 |
---|
这两个体系是互斥的:一般约束不 适用于对Microsoft.SharePoint.dll程序集的调用。 |
通过两种机制施加一般约束:
-
高度限制的 CAS 策略大大限制了沙盒工作进程中可执行的代码。在 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\CONFIG 中的wss_usercode.config文件中定义了该策略,并在 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode 中的web.config文件中引用了该策略。(我们不支持更改此文件。)由 CAS 策略施加的限制如下:
-
沙盒中的代码不能调用非托管代码。
-
沙盒中的代码不能调用 Microsoft .NET Framework 3.5 反射 API。
-
沙盒中的代码只能调用具有 AllowPartiallyTrustedCallersAttribute 属性的 .NET Framework 3.5 程序集。这将阻止对约三分之二的 .NET Framework 3.5 API(例如,包括 System.Printing)的访问。此外,一些 SharePoint 程序集不具有此属性。有关具有和不具有此属性的 .NET Framework 程序集的列表,请参阅 沙盒解决方案中可用和不可用的 .NET 程序集。有关具有和不具有此属性的 SharePoint 程序集的列表,请参阅 沙盒解决方案中可用和不可用的 SharePoint 程序集。
注释 CAS 策略将强名称 Microsoft Office 程序集视作例外。这些程序集授予了完全信任。
有关此 CAS 策略及其含义的详细信息,请参阅 沙盒解决方案的限制。
-
-
其次,沙盒工作进程具有一个低权限的安全令牌。
-
该令牌拒绝进程对文件系统进行读取或写入的权限。
-
该令牌拒绝进程对网络进行调用的权限。因此,只能访问运行沙盒工作进程的服务器上可用的资源。例如,无法访问外部数据库。
-
该令牌拒绝进程对注册表进行写入的权限。
-
该令牌拒绝对未在常规程序集缓存中的任何程序集进行调用的权限,即使它具有 AllowPartiallyTrustedCallersAttribute 属性也是如此,否则它将符合从沙盒工作进程进行调用的资格。
-
请记住,这些限制不 适用于对Microsoft.SharePoint.dll程序集中的 API 的调用。因此,对 GetLocalizedString 的调用可从文件系统中的资源文件读取,而对 SPList 对象的调用可读取并写入到内容数据库中,无论其所在的服务器如何。(但是,不能将文件部署到沙盒解决方案中的磁盘,因此,必须将.resx作为场解决方案单独安装。)
服务器端对象模型约束体系中的主要限制是,只能从沙盒解决方案调用Microsoft.SharePoint.dll程序集中的部分 API。调用任何禁止的 API 会引发异常(将捕获该异常,并将其作为错误报告给用户)。
以下是可访问的 SharePoint 对象模型的一些限制:
-
SPWebApplication 类不可用。此外,这意味着,沙盒解决方案无法访问其托管网站集外部的任何内容。
-
Microsoft.SharePoint.WebControls 命名空间中的所有类几乎都不可用,这意味着,您只能使用沙盒解决方案中的 ASP.NET 控件。
有关对沙盒解决方案可用的Microsoft.SharePoint.dll类的完整列表,请参阅 沙盒解决方案中可用的 Microsoft.SharePoint.dll API。
此限制由一对位于 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode\assemblies 中的特别受限版本的Microsoft.SharePoint.dll程序集(称作填充程序 程序集)实现。这两个版本与标准Microsoft.SharePoint.dll程序集的主要差异是,它们仅包含标准版本中的部分类和成员。
这两个填充程序程序集之一由沙盒工作进程加载。另一个填充程序程序集在完全信任下运行的特殊代理进程 (SPUCWorkerProcessProxy.exe) 中加载,并由 SharePoint Foundation 沙盒代码服务管理。此外,标准Microsoft.SharePoint.dll程序集也在此代理进程中加载。
这两个填充程序程序集的主要工作是,筛选出禁止的 SharePoint 类和成员。在从沙盒工作进程中的任何代码调用Microsoft.SharePoint.dll时,它将重定向到程序集的填充程序版本。如果要调用的 API 未在填充程序程序集中,则将引发异常(将捕获该异常,并将其作为错误报告给用户)。
当沙盒解决方案调用填充程序程序集中包含的已批准的 API 时,第一个填充程序程序集会在完全信任代理进程中将此 API 传递给第二个填充程序程序集,而第二个填充程序程序集会将此 API 传递给标准Microsoft.SharePoint.dll。任何返回的结果将传递回原始调用代码。可通过 .NET 远程来实现此跨进程交互。沙盒工作进程和完全信任代理进程总是一起启动并成对出现。如果其中一个进程崩溃,则另一个进程也会停止。
服务器端对象模型约束体系中存在第二限制,该限制也由填充程序程序集强制实施。可从沙盒解决方案中调用某些 SharePoint API,但只会将针对参数的特殊限制传递给这些 API。这些输入限制由填充程序程序集强制实施,并确保在发生冲突时引发异常。在 SharePoint Foundation 2010 中,仅 SPSite(String) 和 SPSite(Guid) 构造函数属于此情况。虽然它们对沙盒解决方案可用,但只能将引用安装了沙盒解决方案的网站集的 URL 或 GUID 传递给它们。
注释 |
---|
这是因为第二个填充程序程序集和标准Microsoft.SharePoint.dll在一般约束不适用的完全信任进程中运行。这些约束位于沙盒工作进程 中。 |
重要信息 |
---|
沙盒解决方案自身的部署阶段在沙盒工作进程中运行,并受相同执行约束的限制。例如,在部署沙盒解决方案时,无法将文件部署到磁盘。这是用户控件(ASCX 文件)不能位于沙盒解决方案中的主要原因。 |
图 1 演示如何在 HTTP 请求访问沙盒解决方案时处理该请求。
SPUCHostService.exe、SPUCWorkerProcess.exe和SPUCWorkerProcessProxy.exe文件位于 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode。
沙盒解决方案受三种资源使用率限制的约束,可根据 (1) 限制应用于的实体类型和 (2) 因超出限制而受到处罚的实体类型对这些限制进行分类。
-
每个请求(请求遭到处罚):对于完成沙盒解决方案所需的时间有一个硬性限制。默认情况下,此时间限制为 30 秒。如果沙盒解决方案超出了该限制,则将终止请求(而非沙盒工作进程)。(此限制是可配置的,但只能通过针对对象模型的自定义代码进行此操作。对象模型的相关部分对沙盒解决方案不可用,因此,任何沙盒解决方案都无法更改此限制。)
-
每个请求(进程遭到处罚):有一组适用于请求的附加资源限制(共 15 条)。如果请求超出某个限制,则将终止进程(以及进程中运行的所有 沙盒解决方案)。
-
每天/每个网站集(网站集遭到处罚):每个网站集均受可配置的每日“资源点”最大数的限制。这些点基于某种算法进行累计,该算法会考虑网站集中安装的沙盒解决方案对 15 类资源的使用。当网站集超出其允许的最大点数时,该网站集中的所有沙盒解决方案将终止,且在剩余时间内再也无法运行。
有关对沙盒解决方案施加的资源限制的详细信息,请参阅 SharePoint 2010 中沙盒解决方案的资源使用率限制。
当客户端计算机请求包含沙盒解决方案中的组件(例如,沙盒解决方案中部署的 Web 部件)的 SharePoint 页时,SharePoint 会呈现多个页对象。其中一个页对象在 Microsoft ASP.NET 工作进程 (w3wp.exe) 中呈现,而其他页对象在沙盒工作进程中呈现。所有非沙盒组件会在 ASP.NET 工作进程中的页上呈现,而第一个沙盒组件会在沙盒工作进程中的一个页对象上呈现。在完全呈现沙盒工作进程中的该页时,会将该页并入 ASP.NET 进程中的页对象。如果用户请求的页上有多个沙盒组件,则将在这些组件在沙盒工作进程中所对应的页对象上单独呈现它们。反过来,每个此类页对象将并入 ASP.NET 进程中的页对象。
作为负面影响,此系统会对可在沙盒解决方案中执行的操作施加其他限制。有关这些限制的详细信息,请参阅 沙盒解决方案的限制。
沙盒解决方案可通过两大方式摆脱常规限制。目前,最重要的是使用客户端代码访问无法从沙盒解决方案中的服务器端代码访问的资源。例如,沙盒解决方案可包含带 JavaScript 的自定义网页,JavaScript 可调用 SharePoint 的 JavaScript 客户端对象模型。此外,沙盒解决方案可包含承载 Microsoft Silverlight 应用程序的 Web 部件。后面的应用程序可调用 SharePoint 的 Silverlight 客户端对象模型。沙盒解决方案上的任何限制都不适用于客户端代码。不存在以下限制:代码执行限制、资源访问限制和资源使用率限制。有关详细信息,请参阅How to: Extend the Power of a Sandboxed Solution with the SharePoint Client Object Model。
沙盒解决方案体系结构还支持一种技术,沙盒解决方案可利用该技术调用在完全信任下运行的自定义操作。该技术需要开发一个服务器场解决方案,它包括派生自SPProxyOperation 的一个或多个类。其中的每个类均定义一个将在完全信任下运行的操作,并且可通过 ExecuteRegisteredProxyOperation 方法从沙盒解决方案中调用这些类。具体而言,将在运行标准Microsoft.SharePoint.dll程序集的相同代理进程 (SPUCWorkerProcessProxy.exe) 中执行这些完全信任代理操作。代理操作可将数据返回到沙盒解决方案。
图 2 演示如何在一个沙盒解决方案调用完全信任代理时处理访问该沙盒解决方案的请求。
前面的说明可能给您留下以下印象,借助此技术,总是由同一开发团队来开发服务器场和沙盒解决方案。实际上,可以专门开发包含代理操作类的场解决方案以向任一和所有需要这些服务的沙盒解决方案(包括由其他团队开发的沙盒解决方案)提供特定操作。例如,由于沙盒解决方案无法写入 SharePoint ULS 日志,因此对沙盒解决方案公开代理日志记录操作的场解决方案会很有用。
有关开发和调用完全信任代理操作的详细信息,请参阅 Sandboxed Solutions in Partnership with Full-Trust Proxies in SharePoint 2010 (该链接可能指向英文页面)和同一节点中的其他主题。