我有一个网址列表(内容类型用法网址)。现在,内容类型跨Web部署。我需要循环这些内容类型并在每个列表中执行一些操作,但是每个循环打开新的SPWeb实例都太耗费资源。
是否有内置方法告诉我此URL是否属于某个SPWeb对象?
示例:
SPWeb可能是
使用内容类型使用链接:
正如您所看到的,对于前三次使用,我不需要打开新的SPWeb
答案 0 :(得分:2)
只是一个猜测,但也许值得在你已经拥有的SPWeb实例上尝试SPWeb.GetList(serverRelativeUrl)
,如果没有匹配,那么创建一个新的SPWeb?
更新:另一个想法。假设所有SPWebs都在同一个SPSite中,您也可以使用this particular overload of SPSite.OpenWeb()
(并将requestExactUrl标志设置为false)。这将返回您需要的SPWeb对象。 在内部,打开的SPWeb对象被重用(你可以在Reflector中的错误,SPweb对象只是存储在列表,没有重复使用。SPWeb.SPWebConstructor
方法中看到),所以这不会对性能造成太大影响。
答案 1 :(得分:1)
您的代码将在什么上下文中运行?
我的意思是,您希望编写一些代码,这些代码将作为部署过程的一部分运行,这意味着它只会偶尔运行。
如果是这种情况,您的代码是否针对性能进行了优化是否重要?在我看来,最好坚持打开每个SPWeb的简单解决方案,而不要过分担心性能。
如果您需要遍历数百或数千个网站,则需要一些时间。你的代码需要十分钟才能完成,或十五分钟,这真的不重要。
如果要经常多次运行,性能会更成问题。
答案 2 :(得分:0)
据我所知,这种事情没有内置的方法 我建议你为此创建一个SPWeb扩展方法。
这是一个让您入门的代码片段(未经过100%测试):
public static class SPWebExtensions
{
public static bool UrlBelongsToweb(this SPWeb web, string url)
{
Uri uriWeb = new Uri(web.Url);
if (uriWeb.LocalPath.ToLower() == url.ToLower())
return true;
if (!url.ToLower().StartsWith(uriWeb.LocalPath.ToLower()))
return false;
foreach (SPWeb subWeb in web.Webs)
{
Uri uriSub = new Uri(subWeb.Url);
if (url.ToLower().StartsWith(uriSub.LocalPath.ToLower()))
return false;
subWeb.Dispose();
}
return true;
}
}
你可以用这样的东西:
bool urlBelongsToWeb = web.UrlBelongsToweb("/web2/Lists/Documents");
web是您当前的SPWeb对象。
或者,如果您想要定位SiteCollection中的特定列表,请使用SPSiteDataQuery来抓住它们并对它们进行神奇的工作。