演習 - Microsoft Graph を使用してユーザーの予定表イベントにアクセスする

完了

これまでに説明したすべての概念を使用して、サンプル アプリを変更し、予定表イベントにアクセスしてみましょう。

  1. エディターで Startup.cs を開き、ConfigureServices で定義されているMicrosoft Identity、Microsoft Graph、および ASP.NET Coreミドルウェアを調べてください。

  2. ConfigureServices() メソッド内で次のコードを見つけます。 このコードは、GraphProfileClient および GraphEmailClient という名前のカスタム オブジェクトの依存関係の挿入を有効にします。 オブジェクトの範囲は HTTP 要求です。つまり、サーバーへの要求ごとに 1 回作成されます。

    services.AddScoped<GraphProfileClient>();
    services.AddScoped<GraphCalendarClient>();
    
  3. Graph/GraphCalendarClient.cs を開き、既存のコードを確認します。 次のフィールドとメソッドに注意してください。

    • _logger_graphServiceClient という名前の 2 つの readonly フィールドがクラスに含まれています。 コンストラクターに挿入されたオブジェクトは、これらのフィールドに割り当てられます。
    • このクラスには、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_graphProfileClientMailboxSettingsEvents などのいくつかのフィールドとプロパティが含まれています。
    • 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);
    

    このコードは、ユーザーのメールボックス設定を取得し、タイム ゾーンが定義されているかどうかを判断し、GraphCalendarClient クラスで前にGetEvents()作成したメソッドにユーザーのタイム ゾーンを渡します。 取得したイベントは、クラスの Events プロパティに格納されます。

  12. 続行する前に、Calendar.cshtml.cs を保存してください。

  13. Pages/Calendar.cshtml を開きます。 これは、CalendarModel クラスに格納されている予定表イベント データをレンダリングするために使用される Razor Pages ファイルです。 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)
    

    CalendarModel クラスの FormatDateTimeTimeZone()関数は、ページの読み込み時に取得された MailboxSettings を使用して、開始日時と終了日時の値を、ログインしているユーザーが定義したタイム ゾーンに変換する処理を行います。

  20. 続行する前に、Calendar.cshtml を保存してください。

翌週のサインインしたユーザーのイベントを表示するコード スニペットを追加したので、次のステップはアプリをローカルで実行することです。

アプリを実行する

アプリケーションを実行してテストするには、Microsoft Outlook または Microsoft Teams を使用して予定表に予定表イベントを追加する必要があります。 イベントは、現在の日付から 1 週間以内に収まる必要があります。

アプリケーションを実行して試してみましょう。

  1. コード エディターに基づいて、次の手順を実行します。

    • Visual Studio

      F5 キーを押して、プロジェクトをビルドして実行します。

    • Visual Studio Code または別のコード エディター

      Begin フォルダーでターミナル ウィンドウを開き、次のコマンドを実行します。

      dotnet run
      
  2. ブラウザーを開き、https://localhost:5001 にアクセスします。

  3. Microsoft Entra アプリケーションを登録するときに前に使用した Microsoft 365 開発者テナントを使用してサインインします。

  4. 必要な権限に同意すると、アプリケーションは検証済みのアカウント情報を使用してアクセス トークンを取得しようとします。 これは、Startup.cs で前述したミドルウェアによって処理されます。

  5. アプリケーションでトークンを正常に取得した後、Microsoft Graph /me エンドポイントに対して GET 要求が行われ、アクセス トークンが承認ヘッダーで渡されます。 /me を呼び出すと、サービスからデータが安全に取得されます。

  6. Microsoft Graph から応答を受信すると、サインインしたユーザーの名前が記載されたウェルカム メッセージが表示されます。

    アプリケーションにサインインした後にユーザー名を表示するページ。

  7. ヘッダーの [予定表] リンクを選択して、ユーザーの予定表イベントを表示します。

  8. ページが読み込まれると、Microsoft Graph /m*e/calendarView エンドポイントに対して GET 要求が行われ、アクセス トークンが承認ヘッダーで渡されます。 /me/calendarView を呼び出すと、サービスからデータが安全に取得され、ページに表示されます。

    予定表イベントを表示するページ。

    注:

    予定表イベントが表示されない場合は、アプリへのサインインに使用したユーザーのアカウントに予定を追加してください。

  9. 続行する前に、ブラウザーを閉じ、ターミナル ウィンドウで CTRL+C キーを押して、サーバーを停止します。

    注:

    Visual Studio でプロジェクトを開いた場合は、ブラウザーを閉じるか、Visual Studio で SHIFT+F5 キーを選択して、サーバーを停止できます。 Visual Studio がまだ開いている場合は、作成したターミナル ウィンドウを閉じます。

Microsoft Graph と ASP.NETCore を使用して、サインイン ユーザーの Microsoft 365 予定表イベントにアクセスし表示する方法を実証できました。