为SPAuditEntry获取SPWeb

时间:2009-12-21 15:45:33

标签: sharepoint moss sharepoint-2007

我目前正在构建一个应用程序,它将解析网站集中的所有审核条目,并向用户发送一封漂亮的电子邮件。

我的问题是电子邮件应该基于特定的网络(本质上是一封电子邮件,总结了每个子网站发生的变化)。显然,除了DocLocation属性之外,SPAuditEntry对象中没有关于它来自Web的信息。

这意味着我可以获得以下任何DocLocations(ItemType = Document,Event = Update):

  • sites / MySiteCollection / Documents /这是一个test.doc
  • sites / MySiteCollection / Reporting Templates / audit.xml
  • sites / MySiteCollection / Lists / Reporting Metadata / 1_.000
  • 位点/ MySiteCollection / MySubSite1 /列表/公告/ 2_.000
  • sites / MySiteCollection / MySubSite1 / Template Documents / SampleTestEmail.doc

我想如果必须的话,我可以通过使用SPSite.AllWebs.Names从URL中找出网页。

问:我如何确定特定SPAuditEntry来自哪个SPWeb?

2 个答案:

答案 0 :(得分:0)

我可能有一些东西(非常粗糙),但它有点取决于您的子网的嵌套深度。它们只是1级深度(即站点/ web1,站点/ web2或站点/ web1 / web1_1等)。你看看SPAuditEntry对象的EventData xml中是否有ScopeId?找到一篇描述与您使用EventData xml中的ScopeId进行一些匹配的文章相同的文章:

Article

此外,以下文章描述了使用SPSiteDataQuery中的ItemId(guid)来检索项目,然后使用结果数据(WebId和ListId)打开特定的Web /列表。一次检索一个项目可能有点低效,但它有点......

Post

答案 1 :(得分:0)

我的解决方案概述如下:伪代码:

  1. 获取我的网站集中所有网址的集合:_allWebNames = site.AllWebs.Names;
  2. 由于我只关心站点内的顶级SPWeb,因此我解析了SPAuditEntry.DocLocation以获取可能的Web名称。 (例如:将从“sites / MySiteCollection / MySubSite1 / Lists / Announcements / 2_.000”中返回“MySubSite1”)

    string webName = GetPossibleWebName(SERVER_RELATIVE_URL, docLocation);

  3. 然后搜索我的数组以查看网络名称是否匹配。

    index = Array.BinarySearch<string>(_allWebNames, webName, new ServiceSiteNameComparer());

  4. 如果我找到匹配项,那么我可以使用SPSite.OpenWeb(string)打开网页并获取ID。