2016-10-28 3 views
0

В нашем приложении вызывается готовый API Office 365 Management API для извлечения действий и событий в файлах, хранящихся в SharePoint Online. Однако в нашем эксперименте приложение, похоже, не может получить недостаточно журналов.Получить отсутствующий аудит из API управления деятельностью в Office365

Пример: мы загружаем 1000 файлов в библиотеку документов в Sharepoint Online. Мы получаем 8 подписей. При каждой подписке мы получаем максимум 100 журналов. Total call API получает журналы для извлечения 600 журналов. Недостаточно!

Вот мой код, чтобы получить подписку

List<SubscriptionsContent> GetSubscriptionsContents(AuthenticationResult authenticationResult, ManagementAPI m, DateTime startDate, DateTime endDate, bool proxyRequired = false) 
    { 
     try 
     { 
      string jsonSubscription = string.Empty; 
      string url = string.Empty; 
      string logType = "Audit.SharePoint"; 

      if (authenticationResult != null) 
      { 
       url = string.Format(UrlFormat, m.TenantId, string.Format("subscriptions/content?contentType={0}&startTime={1}&endTime={2}", logType, startDate.ToUniversalTime().ToString(DateFormat), endDate.ToUniversalTime().ToString(DateFormat))); 
       jsonSubscription = ExecuteRequest(url, HttpMethod.Get, authenticationResult); 
       //Log.Info("jsonSubscription:"); 
       //Log.Info(jsonSubscription); 
      } 
      var listContent = Common.GetListSubscriptionsContent(jsonSubscription); 
      Log.Info("Common.GetListSubscriptionsContent(jsonSubscription); Count: " + (listContent != null ? listContent.Count.ToString() : "IS NULL")); 
      return listContent; 
     } 
     catch (Exception ex) 
     { 
      Log.Error(ex); 
      return new List<SubscriptionsContent>(); 
     } 
    } 

Вот мой код, чтобы выполнить запрос

public string ExecuteRequest(string url, HttpMethod method, AuthenticationResult token) 
    { 
     var responseStr = ""; 
     try 
     { 
      HttpClient client = new HttpClient(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      HttpRequestMessage request = new HttpRequestMessage(method, url); 
      request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken); 
      HttpResponseMessage response = client.SendAsync(request).Result; 
      Log.Info("ExecuteRequest(string url, HttpMethod method, AuthenticationResult token): response.StatusCode: " + response.StatusCode + " ; response.ReasonPhrase: " + response.ReasonPhrase + " ; response.RequestMessage: " + response.RequestMessage); 


      if (response.IsSuccessStatusCode) 
      { 
       responseStr = response.Content.ReadAsStringAsync().Result; 
      } 
     } 
     catch (Exception ex) 
     { 
      Log.Error(ex); 
     } 

     return responseStr; 
    } 

Вот мой код, чтобы получить журнал аудита от каждой подписки

List<AuditLog> listAudit = new List<AuditLog>(); 
       foreach (var item in listSubscription) 
       { 
        var jsonAudit = ExecuteRequest(item.ContentUri.ToString(), HttpMethod.Get, authenticationResult); 

        if (string.IsNullOrEmpty(jsonAudit)) 
         continue; 
        var listAuditLog = Common.GetListAuditLog(jsonAudit); 
        } 

Вот мой код для анализатора JsonString

public static List<AuditLog> GetListAuditLog(string jsonString) 
    { 
     try 
     { 
      return JsonConvert.DeserializeObject<List<AuditLog>>(jsonString); 
     } 
     catch (Exception ex) 
     { 
      Log.Error("public static List<AuditLog> GetListAuditLog(string jsonString)", ex.InnerException); 
      return new List<AuditLog>(); 
     } 
    } 

ответ

1

Я думаю, что вам нужно использовать заголовок страницы.

Если объем данных слишком велик, API вернет заголовок с именем NextPageUrl, содержащий адрес, который будет использоваться для запроса следующей страницы результатов. Эта ссылка (представляющая запрос) будет доступна в течение 24 часов.

Ex.

HTTP/1.1 200 OK 
Content-Type: application/json; charset=utf-8 
NextPageUrl:https://manage.office.com/api/v1/{tenant_id}/activity/feed/subscriptions/content?contentType=Audit.SharePoint&amp;startTime=2015-10-01&amp;endTime=2015-10-02&amp;nextPage=2015101900R022885001761 

Таким образом, если ответ содержит эту запись заголовка, просто используйте значение NextPageUrl для запроса большего количества данных.

Повторите этот процесс, пока эта запись заголовка больше не существует.

Дополнительную информацию можно получить в Office 365 Management API reference