开发沙盒解决方案的最佳实践

上次修改时间: 2011年4月12日

适用范围: SharePoint Foundation 2010

本文内容
避免创建静态成员
避免引发未处理异常
使用 AllowPartiallyTrustedCallers 属性和 SharePointPermission 属性

在 SharePoint Online 中提供

本主题介绍开发沙盒解决方案的一些最佳做法。

避免创建静态成员

在运行 SharePoint Foundation 沙盒代码服务(有时称为用户代码主机服务)的给定服务器上首次处理特定沙盒解决方案时,该服务会在沙盒工作进程中为其创建一个应用程序域,解决方案代码中的所有静态变量都会加载到该域中。沙盒解决方案完成后,该应用程序域会保持活动状态,如果不同网站集上的不同用户再次请求同一沙盒解决方案,则会重用它。此系统的副作用是:不重载静态值,并且这些值不一定适合于每个上下文中的沙盒解决方案的每次执行。例如,假定解决方案代码将 SPContext.Current 放入名为 myContext 的静态字段中。如果从其他网站集请求同一解决方案,则 myContext.Site 的值是不正确的。

因此,应避免在沙盒代码中创建静态字段和属性。

避免引发未处理异常

您的代码不应引发它未处理的任何异常。这是因为,沙盒解决方案 中未经处理的异常会终止沙盒工作进程中的所有沙盒解决方案,而不只是终止引发异常的那个沙盒解决方案。出于同一原因,最好捕获所有异常并向沙盒解决方案的 UI 报告相应的错误,例如 Exception 对象的 Message 属性。

使用 AllowPartiallyTrustedCallers 属性和 SharePointPermission 属性

沙盒工作进程中的代码只能调用具有 AllowPartiallyTrustedCallersAttribute 的程序集。这意味着您在沙盒解决方案中部署的大多数自定义程序集都必须具有此属性。此外,ASP.NET 要求在包括从 WebPart 派生的类的所有程序集中包含此属性。因此,每次启动沙盒解决方案项目时,Microsoft Visual Studio 默认情况下都会将此属性放到 AssemblyInfo 文件中。但是,如果解决方案包曾安装为服务器场解决方案,则具有此属性的程序集会创建安全问题,因为它会使任何部分信任调用方在完全信任环境中调用该程序集的类。如果任意类访问 SharePoint 对象模型,则任何部分信任调用方均可访问 SharePoint 对象模型。为防止出现此情况,在带 AllowPartiallyTrustedCallers 属性标记的程序集中,调用 SharePoint 对象模型的每个类都必须具有以下权限请求属性:

[Microsoft.SharePoint.Security.SharePointPermission(System.Security.Permissions.SecurityAction.LinkDemand, ObjectModel=true)]

这将确保只有具有 SharePoint 对象模型权限的调用方才能调用该类的成员。

并不要求沙盒解决方案中的所有 程序集都必须具有 AllowPartiallyTrustedCallers 属性。例如,事件接收器只由完全信任 EventCodeHost 调用,因此如果程序集中只包含事件接收器,则可移除 AllowPartiallyTrustedCallers 属性。

请参阅

概念

可以在沙盒解决方案中实现哪些内容

其他资源

沙盒解决方案