是否有内置方法来判断特定URL是否属于此SPWeb或其他SPWeb?

时间:2010-03-18 10:11:50

标签: sharepoint sharepoint-2007 wss wss-3.0

我有一个网址列表(内容类型用法网址)。现在,内容类型跨Web部署。我需要循环这些内容类型并在每个列表中执行一些操作,但是每个循环打开新的SPWeb实例都太耗费资源。

是否有内置方法告诉我此URL是否属于某个SPWeb对象?

示例:

SPWeb可能是

使用内容类型使用链接:

  • / WEB2 /页
  • / WEB2 /列表/任务
  • / WEB2 /列表/文件
  • / WEB2 / subweb1 /列表/任务
  • ...

正如您所看到的,对于前三次使用,我不需要打开新的SPWeb

3 个答案:

答案 0 :(得分:2)

只是一个猜测,但也许值得在你已经拥有的SPWeb实例上尝试SPWeb.GetList(serverRelativeUrl),如果没有匹配,那么创建一个新的SPWeb?

更新:另一个想法。假设所有SPWebs都在同一个SPSite中,您也可以使用this particular overload of SPSite.OpenWeb()(并将requestExactUrl标志设置为false)。这将返回您需要的SPWeb对象。 在内部,打开的SPWeb对象被重用(你可以在Reflector中的SPWeb.SPWebConstructor方法中看到),所以这不会对性能造成太大影响。错误,SPweb对象只是存储在列表,没有重复使用。

答案 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来抓住它们并对它们进行神奇的工作。