练习 - 显示用户文件

已完成

在此练习中,你将扩展应用以显示 OneDrive for Business 中用户的 OneDrive for Business 根文件夹里的文件列表。

获取文件列表

首先将 Microsoft Graph 调用添加到应用程序。

  1. 在编辑器中打开 Startup.cs,花些时间浏览 ConfigureServices() 中定义的 Microsoft 标识、Microsoft Graph 和 ASP.NET Core 中间件。

  2. ConfigureServices() 方法中找到以下代码。 此代码为名为 GraphProfileClientGraphFilesClient 的自定义对象启用依赖关系注入。 这些对象的范围为 HTTP 请求,这意味着每对服务器请求一次,都将会创建这些对象。

    services.AddScoped<GraphProfileClient>();
    services.AddScoped<GraphFilesClient>();
    
  3. 打开 Graph/GraphFilesClient.cs,花些时间浏览现有代码。 请注意下列功能:

    • 名为 _logger_graphServiceClient 的两个 readonly 字段包含在该类中。 注入构造函数的对象将分配给这些字段。
    • 该类包含 GetFiles()DownloadFile()UploadFile()UploadLargeFile() 方法。
  4. 删除构造函数中的现有代码。

  5. 修改构造函数以注入参数值 ILogger<GraphFilesClient>GraphServiceClient,并将其分配给关联字段:

    public GraphFilesClient(
      ILogger<GraphFilesClient> logger,
      GraphServiceClient graphServiceClient)
    {
      _logger = logger;
      _graphServiceClient = graphServiceClient;
    }
    
  6. 找到 GetFiles() 方法。 在 try 文本块中,将现有代码替换为以下代码,以使用 _graphServiceClient 从用户帐户检索文件。

    return await _graphServiceClient.Me.Drive.Root.Children
                .Request()
                .Select(file => new
                {
                    file.Id,
                    file.Name,
                    file.Folder,
                    file.Package
                })
                .GetAsync();
    
  7. 找到方法 DownloadFile(),将 try 文本块中的现有代码替换为以下代码,从而根据其 ID 检索文件。

    return await _graphServiceClient
        .Me.Drive.Items[fileId].Content
        .Request()
        .GetAsync();
    
  8. 保存 GraphFilesClient.cs 文件,然后再继续。

  9. 打开 Pages/Files.cshtml.cs 并花些时间浏览现有代码。 请注意下列功能:

    • FilesModel 包含多个字段和属性,如 _logger_graphFilesClientUploadedFileFiles
    • GraphFilesClient 被注入到构造函数中并分配给 _graphFilesClient 字段。
    • 已定义 OnGetAsync()OnPostAsync()OnGetDownloadFile() 方法。
  10. 找到 OnGetAsync() 方法,并将现有代码替换为以下代码:

    Files = await _graphFilesClient.GetFiles();
    

    此代码使用 GraphFilesClient 实例检索用户文件并将其分配给 Files 属性。

  11. 找到 OnGetDownloadFile() 方法,将其中的现有代码替换为以下代码:

    var stream = await _graphFilesClient.DownloadFile(id);
    return File(stream, MediaTypeNames.Application.Octet, name);
    

    此代码将执行以下任务:

    • 调用 _graphFilesClient.DownloadFile 方法,该方法会接受文件 ID 作为参数。
    • 返回文件流后,OnGetDownloadFile() 返回来自 Razor 页面的新 File 对象。 此步骤允许在用户的浏览器中下载文件。
  12. 保存 Files.cshtml.cs 文件,然后再继续。

在应用中显示并下载文件

下一步是在网页中显示用户文件并允许下载这些文件。

  1. 在编辑器中打开 Files.cshtml 文件。

  2. 花些时间查看 HTML 和 Razor 代码,并注意它处理以下任务:

    • 确保对用户进行身份验证。
    • 检查 Model.Files 属性以查看是否有要在页面中进行访问和显示的文件。
  3. 找到行 @* Add foreach here *@ 注释并将其替换为以下代码:

    @foreach(var file in Model.Files)
    {
    
  4. 找到 @* Add foreach closing bracket here *@ 注释并将其替换为上一步中添加的 foreach 语句的右方括号。

  5. foreach 循环中添加以下代码:

    if (file.Folder == null && file.Package == null) {
        <li>
            <a asp-page-handler="DownloadFile"
                asp-route-name="@file.Name"
                asp-route-id="@file.Id">@file.Name</a>
        </li>
    }
    

    此代码将执行以下任务:

    • 检查文件对象不是文件夹或包。
    • 使用 Razor 语法创建超链接。 当用户选择链接时,文件名和文件 ID 将传递给之前修改的 FilesModelDownloadFile 方法。
  6. 保存 Files.cshtml 文件,然后再继续。

运行应用

在运行应用程序之前,请确保用于登录的帐户在OneDrive 中有一些文件。 快来运行应用程序试用吧!

  1. 基于代码编辑器执行以下步骤:

    • Visual Studio

      F5 生成并运行项目。

    • Visual Studio Code 或其他代码编辑器

      Begin 文件夹中打开终端窗口,并运行以下命令:

      dotnet run
      
  2. 打开浏览器访问 https://localhost:5001

  3. 使用之前注册 Microsoft Entra 应用程序时使用的 Microsoft 365 开发人员租户登录。

  4. 选择标题中的“文件”链接,以查看用户的 OneDrive 文件。

    显示日历事件的页面。

    注意

    如果未看到任何文件,请确保用户在 OneDrive 中有文件。

  5. 选择列表中的文件,下载到计算机。

  6. 关闭浏览器,然后在终端窗口中按 CTRL+C停止服务器,然后再继续。

    注意

    ’如果已在 Visual Studio 中打开项目,则可以关闭浏览器或在 Visual Studio 中选择 SHIFT+F5来停止服务器。 如果仍然处于打开状态,请关闭 Visual Studio 创建的终端窗口。

你已成功演示了如何使用 Microsoft Graph 和 ASP.NET Core 访问、显示和下载文件!