Упражнение: доступ к событиям календаря пользователя с помощью Microsoft Graph

Завершено

Давайте применим концепции, рассмотренные ранее, и внесем изменения в пример приложения для доступа к событиям календаря.

  1. Откройте файл Startup.cs в редакторе и изучите ПО промежуточного слоя Microsoft Identity, Microsoft Graph и ASP.NET Core, определенное в ConfigureServices.

  2. Найдите следующий код в методе ConfigureServices(). Этот код обеспечивает внедрение зависимостей для пользовательских объектов GraphProfileClient и GraphEmailClient. Объекты получают область для HTTP-запроса, иначе говоря, они будут создаваться один раз для каждого запроса к серверу.

    services.AddScoped<GraphProfileClient>();
    services.AddScoped<GraphCalendarClient>();
    
  3. Откройте Graph/GraphCalendarClient.cs и изучите имеющийся код. Обратите внимание на следующие поля и методы:

    • В класс включены два поля readonly: _logger и _graphServiceClient. Этим полям будут назначены объекты, внедренные в конструктор.
    • Класс содержит методы GetEvents(), GetUserMailboxSettings() и GetUtcStartOfWeekInTimeZone().
  4. Удалите в конструкторе существующий код.

  5. Измените конструктор: внедрите ILogger<GraphCalendarClient> и GraphServiceClient и присвойте связанным полям значения параметров:

    public GraphCalendarClient(
      ILogger<GraphCalendarClient> logger,
      GraphServiceClient graphServiceClient)
    {
        _logger = logger;
        _graphServiceClient = graphServiceClient;
    }
    
  6. Найдите метод GetEvents() и замените существующий код следующим. Этот код определяет начальную и конечную даты событий календаря, которые будут извлечены.

    _logger.LogInformation($"User timezone: {userTimeZone}");
    // Configure a calendar view for the current week
    var startOfWeek = DateTime.Now;
    var endOfWeek = startOfWeek.AddDays(7);
    var viewOptions = new List<QueryOption>
    {
      new QueryOption("startDateTime", startOfWeek.ToString("o")),
      new QueryOption("endDateTime", endOfWeek.ToString("o"))
    };
    
  7. Сразу же после предыдущего кода, добавленного в GetEvents(), добавьте следующие блоки кода try/catch:

    try
    {
    
    }
    catch (Exception ex)
    {
        _logger.LogError($"Error calling Graph /me/calendaview: { ex.Message}");
        throw;
    }
    
  8. В блоке try добавьте следующий код для использования viewOptions, определения возвращаемых свойств событий календаря, определения сортировки результатов и инициирования вызова me/calendarView:

    // Use GraphServiceClient to call Me.CalendarView
    var calendarEvents = await _graphServiceClient
        .Me
        .CalendarView
        .Request(viewOptions)
        .Header("Prefer", $"outlook.timezone=\"{userTimeZone}\"")
        .Select(evt => new
        {
          evt.Subject,
          evt.Organizer,
          evt.Start,
          evt.End
        })
        .OrderBy("start/DateTime")
        .GetAsync();
    
    return calendarEvents;
    
  9. Сохраните GraphCalendarClient.cs, прежде чем продолжить.

  10. Откройте файл Pages/Calendar.cshtml.cs и изучите имеющийся код. Обратите внимание на следующее:

    • Класс CalendarModel содержит несколько полей и свойств, таких как _logger, _graphCalendarClient, _graphProfileClient, MailboxSettings и Events.
    • ILogger<CalendarModel>, GraphCalendarClient и GraphProfileClient внедряются в конструктор и назначаются связанным полям.
    • В класс включен метод FormatDateTimeZone(). Он используется для форматирования объекта DateTime.
  11. Найдите метод OnGetAsync() и замените существующий код следующим:

    MailboxSettings = await _graphCalendarClient.GetUserMailboxSettings();
    var userTimeZone = (String.IsNullOrEmpty(MailboxSettings.TimeZone))
        ? "Pacific Standard Time"
        : MailboxSettings.TimeZone;
    Events = await _graphCalendarClient.GetEvents(userTimeZone);
    

    Этот код извлекает параметры почтового ящика пользователя, определяет, определен ли часовой пояс, и передает часовой пояс GetEvents() пользователя в метод, созданный ранее в классе GraphCalendarClient . Полученные события хранятся в свойстве Events класса .

  12. Прежде чем продолжить работу, сохраните Calendar.cshtml.cs.

  13. Откройте Pages/Calendar.cshtml. Это файл Razor Pages, используемый для отображения данных событий календаря, хранящихся в классе CalendarModel. Он поочередно обрабатывает события, хранящиеся в свойстве Events класса CalendarModel, и записывает сведения о каждом событии календаря на странице.

  14. Изучите код HTML и Razor и обратите внимание на то, что он обрабатывает следующие задачи:

    • Гарантирует, что пользователь прошел проверку подлинности.
    • Проверяет свойство Model.Events, чтобы узнать, есть ли события для поочередной обработки и отображения на странице.
  15. Найдите в файле комментарий @* Add foreach here *@ и замените его следующим кодом:

    @foreach(var evt in Model.Events)
    {
    
  16. Найдите комментарий @* Add foreach closing bracket here *@ и замените его закрывающей скобкой для оператора foreach, добавленного на предыдущем шаге.

  17. Найдите комментарий @* Add event subject here *@ и замените его следующим кодом для извлечения темы каждого события:

    @evt.Subject
    
  18. Найдите комментарий @* Add event start date/time here *@ и замените его следующим кодом для извлечения начальной даты и времени события:

    @Model.FormatDateTimeTimeZone(evt.Start)
    
  19. Наконец, найдите комментарий @* Add event end date/time here *@ и замените его следующим кодом для извлечения конечной даты и времени события:

    @Model.FormatDateTimeTimeZone(evt.End)
    

    Функция FormatDateTimeTimeZone() в классе CalendarModel обрабатывает преобразование значений начальной и конечной даты и времени в заданный часовой пояс пользователя с помощью параметров MailboxSettings, извлеченных при загрузке страницы.

  20. Прежде чем продолжить работу, сохраните Calendar.cshtml.cs.

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

Запуск приложения

Чтобы запустить и протестировать приложение, необходимо добавить в календарь некоторые события календаря с помощью Microsoft Outlook или Microsoft Teams. События должны находиться в пределах одной недели, начиная с текущей даты.

Пора запустить приложение и опробовать его!

  1. Выполните следующий шаг в зависимости от используемого редактора кода:

    • Visual Studio

      Нажмите клавишу F5, чтобы выполнить сборку и запуск проекта.

    • Visual Studio Code или другой редактор кода

      Откройте окно терминала в папке Begin и запустите указанную ниже команду.

      dotnet run
      
  2. Откройте браузер и перейдите по адресу https://localhost:5001.

  3. Войдите с помощью клиента разработчика Microsoft 365, который использовался ранее при регистрации приложения Microsoft Entra.

  4. После того как вы согласитесь на необходимые разрешения, приложение попытается получить маркер доступа с помощью проверенных сведений об учетной записи. Это выполняет ПО промежуточного слоя, о котором мы говорили ранее в Startup.cs.

  5. После успешного получения маркера в приложении к конечной точке Microsoft Graph /me выполняется запрос GET, а маркер доступа передается в заголовке авторизации. Затем вызов /me безопасно извлекает данные из службы.

  6. После получения отклика от Microsoft Graph вы увидите приветствие с именем вошедшего пользователя.

    Страница с отображением имени пользователя после входа в приложение.

  7. Выберите ссылку Календарь в заголовке для просмотра событий календаря пользователя.

  8. После загрузки страницы выполняется запрос GET в конечную точку Microsoft Graph /m*e/calendarView, и маркер доступа передается в верхнем колонтитуле авторизации. Затем вызов /me/calendarView безопасно извлекает данные из службы и отображает их на странице.

    Страница с отображением событий календаря.

    Примечание.

    Если вы не видите событий календаря, добавьте события в учетную запись пользователя, которая использовалась при входе в приложение.

  9. Прежде чем продолжать работу, закройте браузер и нажмите клавиши CTRL+C в окне терминала, чтобы остановить сервер.

    Примечание.

    Если вы открыли проект в Visual Studio, можете закрыть браузер или нажать клавиши SHIFT+F5 в Visual Studio, чтобы остановить сервер. Закройте окно терминала Visual Studio, если оно еще открыто.

Вы успешно создали пример получения доступа к событиям календаря в Microsoft 365 и их отображения с помощью Microsoft Graph и ASP.NET Core для пользователя, вошедшего в систему!