Получение SPWeb для SPAuditEntry - PullRequest
0 голосов
/ 21 декабря 2009

В настоящее время я создаю приложение, которое будет анализировать все записи аудита в семействе сайтов и отправлять пользователям красивые электронные письма.

Моя проблема заключается в том, что электронные письма должны быть основаны на определенной сети (по сути, это электронное письмо, в котором обобщаются изменения, произошедшие с каждым дочерним сайтом). По-видимому, в объекте SPAuditEntry нет информации о сети, из которой он получен, за исключением свойства DocLocation.

Это означает, что я могу получить любое из следующих DocLocations (ItemType = Document, Event = Update):

  • sites / MySiteCollection / Documents / Это test.doc
  • sites / MySiteCollection / Шаблоны отчетов / audit.xml
  • sites / MySiteCollection / Списки / Метаданные отчетности / 1_.000
  • сайты / MySiteCollection / MySubSite1 / Lists / Объявления / 2_.000
  • sites / MySiteCollection / MySubSite1 / Шаблоны документов / SampleTestEmail.doc

Я думаю, что, возможно, смогу определить сеть по URL-адресу, используя SPSite.AllWebs.Names, если потребуется.

В: Как мне определить, из какого SPWeb происходит конкретный SPAuditEntry?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2010

Мое решение изложено ниже в псевдокоде:

  1. Получить коллекцию всех имен веб-сайтов в моей коллекции сайтов: _allWebNames = site.AllWebs.Names;
  2. Поскольку меня интересуют только SPWeb верхнего уровня внутри сайта, я анализирую SPAuditEntry.DocLocation, чтобы получить возможное имя в сети. (Пример: вернет «MySubSite1» из «сайтов» / MySiteCollection / MySubSite1 / Списки / Объявления / 2_.000 »)

    string webName = GetPossibleWebName(SERVER_RELATIVE_URL, docLocation);

  3. Затем выполните поиск в моем массиве, чтобы определить, соответствует ли имя сети.

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

  4. Если я найду совпадение, тогда я могу использовать SPSite.OpenWeb(string), чтобы открыть Интернет и получить идентификатор.
0 голосов
/ 21 декабря 2009

У меня может быть что-то (очень грубое), но это в некоторой степени зависит от того, насколько глубоки ваши вложенные сети. Являются ли они просто 1-го уровня (то есть сайт / веб1, сайт / веб2 или сайт / веб1 / веб1_1 и т. Д.). А вы смотрели, есть ли у объектов SPAuditEntry ScopeId в их EventData xml? Нашел статью, которая описывает то же самое, что и вы, который использует ScopeId из XML-файла EventData, чтобы выполнить некоторое сопоставление:

Статья

Кроме того, в следующем посте описывается использование ItemId (guid) в SPSiteDataQuery для извлечения элемента, а затем использование результирующих данных (WebId и ListId) для открытия определенной сети / списка. Может быть немного неэффективно извлекать элемент за раз, но это что-то ...

Сообщение

...