SPSite site = new SPSite(SPContext.Current.Web.Url) 与 SPContext.Current.Web.Site SPSite site = new SPSite(SPContext.Current.Web.Url) 是创建一个新的SPSite对象,使用当前网站的URL作为参数。而SPContext.Current.Web.Site是获取当前网站所属的SPSite对象。

15
为什么有些 SharePoint 的示例会使用“<% %>”语法,而不是 “<%= %>” 语法?

为什么有些 SharePoint 的示例会使用“<% %>”语法,而不是 “<%= %>” 语法?

using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
    ...
}

而不仅仅是简单地?

SPSite site = SPContext.Current.Web.Site;
...

更新

我想我把问题缩小到了以下几点:

看起来我不应该直接使用SPContent.Current,除非我确定我的代码在SharePoint内运行。但这种情况何时不成立?


1
看一下我提出的一个类似的问题:http://sharepoint.stackexchange.com/questions/20192/using-spcontext-current-or-using-static-url - Dennis G
1
在大型项目中,有时会有不在SharePoint中运行的外部工具。另一个例子是单元测试,它们也不在SharePoint中运行。如果您只是开发可视化Web部件并且不进行单元测试-您的代码将在SP中运行。 - Dennis G
当在代码中频繁使用新的SPSite/SPWeb方法时,似乎存在性能问题。 - dc2009
@moontear 我在想:如果我正在编写一个 HttpModule - 它是否运行在 SharePoint 中?它将成为请求的一部分,但更多地是在 IIS/Web 应用程序级别上 - 只是想听听你的意见/观察等。 - Code Jockey
你应该评论我的答案而不是原始帖子;-) - 由于SharePoint干扰了IIS请求管道,我不确定SPContext是否会起作用,创建自己的SPSite肯定更安全。在所有“外部”情况下,您无法确定是否有适当的SPContext(例如特性,在通过PowerShell激活它们时没有上下文!),请使用手动路线。如果您不确定HttpModule如何执行...您知道该怎么做。 - Dennis G
3个回答

11

请查看微软关于在SharePoint 2010中处理对象的最佳实践文档,然而有不同的观点

SharePoint项目有一些关键要点:

  • 始终处理好你的SPWeb / SPSite对象-->防止内存泄漏
  • 当你确定你的代码正在运行在SharePoint上下文环境时,使用SPContext.Current...
    • 单元测试意味着没有SharePoint上下文
    • 外部工具意味着没有SharePoint上下文
    • Powershell意味着没有SharePoint上下文(例如使用功能接收器激活功能可能会失败)
  • 不要处理SPContext.Current...但创建你自己的对象(再次使用using

你可能会在多个SP..对象之间存在一致性问题

最后,SPSite site = SPContext.Current.Web.Site;在某些情况下是可以的,但你无法控制这个site对象-那可能是问题所在。如果你选择new SPSite(...),你将始终拥有你自己的SPSite,而不是由SharePoint创建和管理的东西。

就个人而言,我几乎总是选择使用using结构,以便所有对象在使用完后都能得到正确的处理。另外,我也会使用SPContext.Current.Web而不进行处理。


4

这取决于您的代码运行的上下文环境。例如,如果您在RunWithElevatedPrivileges块中运行,则需要创建一个新的SPSite实例。


0

丹尼斯G是正确的。释放SPSite/SPWeb等对象很重要,但请确保不要直接释放API提供给您的对象。这是微妙但至关重要的,否则您的响应将永远无法生成或导致线程中止情况。 根据我的经验,如果我需要快速获取SPSite或SPWeb属性的信息,并且我确定该信息对用户上下文是可用的(无论是内容管理器授权用户还是匿名用户),那么使用SPContext.Current.*对象是很好的选择。否则,使用RunWithElevatedPriveleges方法来包装您的代码,在该lambda表达式内部采用以下模式:

SPSecurity.RunWithElevatedPrivileges(() =>
{
  using (SPSite site = new SPSite(SPContext.Current.Site.ID))
  {
    using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
    {
     // stuff goes here elevated
    }
  }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接