如何从 Sharepoint 2010 沙盒中的单独线程访问 SPSite 对象
Posted
技术标签:
【中文标题】如何从 Sharepoint 2010 沙盒中的单独线程访问 SPSite 对象【英文标题】:How to access the SPSite object from a separate thread in Sharepoint 2010 Sandbox 【发布时间】:2012-04-25 10:28:15 【问题描述】:我想做的是创建一个在事件接收器FeatureActivated
上启用的计时器。我想使用此计时器每天执行一次,以检查列表中的某些项目并更新这些项目的状态。
我可以创建和启用计时器 - 没问题。但是当我尝试访问 SPSite 对象以获取列表项时,我收到以下错误:
共享点子集 OM 已为当前线程禁用。
计时器在导致问题的单独线程中运行。
我的问题是:如何访问 SPSite 对象以从单独的线程访问列表项?
注意:我正在使用计时器,因为我无法在沙盒解决方案中使用计时器作业。谢谢。
【问题讨论】:
你说的定时器是什么意思? Threading.Timer 或 Timers.Timer 之类的类的实例? 您使用什么代码来获取 SPSite 对象以及您的网站集 URL 是什么? 是 Timers.Timer 类的实例。我这样创建 SPSite 对象:using (SPSite siteCollection = new SPSite("http://localhost:1548")) web = siteCollection.OpenWeb(); SPListItemCollection listItems = myWeb.Lists["Configuration"].Items;
【参考方案1】:
恐怕您在后台运行任务的方法是不可能的。我可以确认您无法在异步委托中访问 SP OM 或在单独的线程上运行。我猜这是因为沙盒解决方案中的资源使用受到监控和限制。例如,您不得在未处置的情况下留下物品。
不仅不允许您使用string
或Guid
创建SPSite
对象;您也不能将事件接收器中可用的 (SPSite)properties.Feature.Parent
对象传递给委托。 (对象的所有属性都会抛出相同的异常。)
一般来说,我认为您的解决方案太脆弱了。在传统的解决方案中,您的代码将在w3wp.exe
进程中运行,并且在激活您的功能后第一个应用程序池回收将终止计时器(整个应用程序域)。同样,在沙盒解决方案中,您将受到SPUCWorkerProcess.exe
的摆布。您需要一些能够每天可靠地执行您的代码的服务主机。
沙盒解决方案和/或 SharePoint Online 不提供后台运行服务的功能。您必须在其他地方运行您的代码,例如:
如果允许您至少部署一个小型场解决方案,则可以将列表项更新代码部署为 SP 计时器作业。
如果您有能力一直运行 Windows 计算机,则可以使用 SP 客户端 OM 编写列表项刷新代码,并将其安装为 Windows Service (timer loop) 或 Windows Scheduled Task (timed start)。 (后者更简单。)
如果您的解决方案应该在 SharePoint Online 中运行并且您不能依赖本地 Windows 计算机,则可以将其部署为 hosted service (Worker Role) in Microsoft Azure。
您可以实现定期更新功能,以便在沙盒解决方案中按需运行 - 例如,作为 ASPX 页面。然后,您将通过pingler 或webcron 等公共服务触发执行代码的资源的URL。
实际上,选项 1 - 3 可以按照与选项 4 相同的方式编写 - 在沙盒解决方案中定期执行的代码和触发代码(非常短且独立于 SP)根据调度程序的性质分开 - 它甚至可以是使用 cron 调度的 LWP 的 perl 脚本。
--- 费达
【讨论】:
感谢您的回答。我正在开发的解决方案必须创建为沙盒解决方案,并且必须在 Sharepoint Online 上运行,安装后我将无法访问任何数据。以上是关于如何从 Sharepoint 2010 沙盒中的单独线程访问 SPSite 对象的主要内容,如果未能解决你的问题,请参考以下文章
沙盒中的 OAuthPermissionsException Instagram API