gpt4 book ai didi

sharepoint - 使用已处理的 SPSite 和 SPWeb 对象

转载 作者:行者123 更新时间:2023-12-04 22:24:52 25 4
gpt4 key购买 nike

我很高兴继承了一个写得很糟糕的 SharePoint 项目。
显然,最初的开发人员是可重用代码的忠实粉丝(30% 的代码在 20 个项目中重用,而没有使用任何库——你猜怎么着?)。

我经常会发现他的代码调用一些 Common.OpenWeb 方法来检索 SPWeb 对象以操作 SharePoint 内容。这个函数的大多数化身看起来完全一样:

public SPWeb OpenWeb()
{
String strSiteUrl = ConfigurationManager.AppSettings["SiteUrl"].ToString();
SPSite site = null;
SPWeb web = null;
try
{
using (site = new SPSite(strSiteUrl))
{
using (web = site.OpenWeb())
{
return web;
}
}
}
catch (Exception ex)
{
LogEvent("Error occured in OpenWeb : " + ex.Message, EventLogEntryType.Error);
}
return web;
}

现在我真的很担心。
这在生产中如何运作?这个方法总是返回一个已处理的对象,对吗?

它到底有多不稳定?

更新:

此方法以下列方式使用:
oWeb = objCommon.OpenWeb();
SPList list = oWeb.Lists["List name"];
SPListItem itemToAdd = list.Items.Add();
itemToAdd["Some field"] = "Some value";
oWeb.AllowUnsafeUpdates = true;
itemToAdd.Update();
oWeb.AllowUnsafeUpdates = false;

为简洁起见,我省略了吞咽的 try-catch
此代码将值插入列表! 这是一个写操作,我很确定 Request 属性正在用于此。那怎么操作呢?

最佳答案

首先,简短的回答:该方法确实返回一个已处理的对象。对象被处理后不应使用,因为它不再处于可靠状态,并且对该对象执行的任何进一步操作(理论上)都应该抛出 ObjectDisposedException

现在,稍加挖掘后,SharePoint 对象似乎不遵循该规则。 SPWeb 不仅在被处理后从不抛出 ObjectDisposedException,而且它实际上会在其 Request 属性中测试这种情况,并从其内部状态重建一个有效的 SPRequest(如果它已被处理)。

似乎至少 SPWeb 被设计为即使在处置状态下也能完全发挥作用。为什么,我不知道。也许它是为了适应您正在处理的客户端代码。也许这是某种我无法理解的复杂优化。

也就是说,我建议您 不要依赖这种行为 ,因为它可能会在 future 发生变化(尽管考虑到微软关于 bug-for-bug 向后兼容性的政策,它可能不会)。

当然,您仍然会泄漏新的 SPRequest 实例,这可能会非常昂贵。永远不要使用已处理的对象,即使 SharePoint 允许您使用它。

关于sharepoint - 使用已处理的 SPSite 和 SPWeb 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com