C# OneDriveからテキストファイルを取得する

Microsoft Graph 用のアプリの登録

アプリの登録

  • 「Azure Active Directory 管理センター」を開く
  • サイドメニューの「Azure Active Directory」をクリック
  • 「既定のディレクトリ」のサイドメニュー「アプリの登録」をクリック
  • 「新規登録」をクリック
  • 名前を付ける
  • 「サポートされているアカウントの種類」で以下をチェック
    任意の組織ディレクトリ内のアカウント (任意の Azure AD ディレクトリ – マルチテナント) と個人の Microsoft アカウント (Skype、Xbox など)
  • 登録をクリック

リダイレクト URI を追加

  • 「リダイレクト URI を追加する」→「+プラットフォームを追加」
  • 「モバイル アプリケーションとデスクトップ アプリケーション」
  • 「https://login.microsoftonline.com/common/oauth2/nativeclient」をチェック

アプリケーション (クライアント) ID の取得

  • 登録したアプリの「アプリケーション (クライアント) ID」をコピーする

Microsoft Graphの認証(GraphClientを使用)

  • 「WPF アプリ(.NET Framework)」プロジェクトを作成する
    ※.NET Frameworkが必要
  • NuGetで以下のパッケージをインストールする
     Microsoft.Identity.Client
     Microsoft.Graph
     Microsoft.Graph.Auth(プレリリースを含める)
  • フィールドの作成
private GraphServiceClient graphClient;
 
  • 「 TokenCacheHelper 」クラスを作成
// using System.Security.Cryptography;

static class TokenCacheHelper
{
    public static void EnableSerialization(ITokenCache tokenCache)
    {
        tokenCache.SetBeforeAccess(BeforeAccessNotification);
        tokenCache.SetAfterAccess(AfterAccessNotification);
    }

    public static readonly string CacheFilePath = System.Reflection.Assembly.GetExecutingAssembly().Location + ".msalcache.bin3";

    private static readonly object FileLock = new object();


    private static void BeforeAccessNotification(TokenCacheNotificationArgs args)
    {
        lock (FileLock)
        {
            args.TokenCache.DeserializeMsalV3(File.Exists(CacheFilePath)
                    ? ProtectedData.Unprotect(File.ReadAllBytes(CacheFilePath),
                                              null,
                                              DataProtectionScope.CurrentUser)
                    : null);
        }
    }

    private static void AfterAccessNotification(TokenCacheNotificationArgs args)
    {
        // if the access operation resulted in a cache update
        if (args.HasStateChanged)
        {
            lock (FileLock)
            {
                // reflect changesgs in the persistent store
                File.WriteAllBytes(CacheFilePath,
                                    ProtectedData.Protect(args.TokenCache.SerializeMsalV3(),
                                                            null,
                                                            DataProtectionScope.CurrentUser)
                                    );
            }
        }
    }
}
 
  • IPublicClientApplicationを利用してGraphServiceClientを取得する
    Microsoft Graph 用のアプリで登録したアプリの「アプリケーション (クライアント) ID」をClientIdに設定する
public static class Graph
{
    public static GraphServiceClient GraphClient;

    private static string ClientId = "アプリケーション (クライアント) ID";
    private static string[] scopes = new string[] { "Files.ReadWrite" };

    public static async Task CreateGraphClient(IntPtr windowHandle)
    {
        IPublicClientApplication PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
                          .WithAuthority(AzureCloudInstance.AzurePublic, "common")
                          .WithDefaultRedirectUri()
                          .Build();
        TokenCacheHelper.EnableSerialization(PublicClientApp.UserTokenCache);

        IEnumerable<IAccount> accounts = await PublicClientApp.GetAccountsAsync();
        var firstAccount = accounts.FirstOrDefault();

        try
        {
            AuthenticationResult authResult = await PublicClientApp.AcquireTokenSilent(scopes, firstAccount)
                .ExecuteAsync();
        }
        catch (Exception)
        {
            AuthenticationResult authResult = await PublicClientApp.AcquireTokenInteractive(scopes)
                        .WithAccount(accounts.FirstOrDefault())
                        .WithParentActivityOrWindow(windowHandle)
                        .WithPrompt(Microsoft.Identity.Client.Prompt.SelectAccount)
                        .ExecuteAsync();
        }
        DeviceCodeProvider authProvider = new DeviceCodeProvider(PublicClientApp, scopes);
        GraphClient = new GraphServiceClient(authProvider);
    }
}
 

GraphClientの作成

// Create GraphClient
await Graph.CreateGraphClient(new WindowInteropHelper(this).Handle);
 

OneDrive内のテキストファイルを取得する

string filePath = "/Documents/MyData/test.txt";

var stream = await GraphClient
        .Me
        .Drive
        .Root
        .ItemWithPath(filePath)
        .Content
        .Request()
        .GetAsync();
string value = "";
using (var reader = new StreamReader(stream))
{
    value = reader.ReadToEnd();
}
 

テキストファイルをOneDriveにアップロードする

4MB以内のファイル

string filePath = "/Documents/MyData/test.txt";

var stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(DateTime.Now.ToString()));
await GraphClient
    .Me
    .Drive
    .Root
    .ItemWithPath(filePath)
    .Content
    .Request()
    .PutAsync<DriveItem>(stream);
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください