在此部分中,我们将生成首个 ASP.NET 项目应用程序,以处理Microsoft Graph 数据连接导出的数据。

新建项目 ASP.NET 项目

  1. 打开Visual Studio,然后选择"文件 ">"新建> Project"。

  2. 在"新建Project 对话框中,执行以下操作。

    1. ASP.NET Web 应用程序中 搜索",然后选择"ASP.NET Web 应用程序 (.NET Framework) 选项。

    2. 单击"下一 步"。

      显示使用 Visual Studio Web 应用程序创建新项目的选项的 ASP.NET 屏幕截图。

    3. 输入 EmailMetrics 作为项目名称。

    4. 选择 .NET Framework 4.7.2 作为框架选项。

    5. 选择“创建”。

    重要

    请确保为此快速启动说明中指定的Visual Studio Project输入完全相同的名称。 Visual Studio 项目名称在代码中成为了命名空间的一部分。 在这些说明里的代码依赖于匹配在这些说明中指定的 Visual Studio 项目名称的命名空间。 如果你使用不同的项目名称,代码不会编译,除非你调整所有的命名空间来匹配你在创建项目时输入的 Visual Studio 项目名称。

    1. 在"新建 web ASP.NET" 项目对话框中,选择"MVC"。
    2. 选择“创建”。

    显示用于选择模型Visual Studio-控制器选项的选项的 (MVC) ASP.NET Web 应用程序。

添加和配置Azure 存储连接服务

  1. 在"解决方案资源管理器"工具窗口中,右键单击"连接的 服务"节点,然后选择"添加已连接服务"。

    Visual-Studio-Add-Connected-Service

  2. 在" 连接的服务 "对话框中,选择位于对话框右上角 + 的绿色符号。

  3. 在"添加依赖项"对话框中,选择 "Azure 存储" 下一 步"。

    显示"Visual Studio"选项的"添加依赖关系"对话框的Azure 存储屏幕截图。

  4. "Azure 存储" 对话框中,选择在上一练习中导出数据的订阅和存储帐户,选择"下一 步"。

    屏幕界面屏幕截图Visual Studio配置Azure 存储,选择订阅和存储帐户。

  5. 为连接 Azure 存储 AzureStorageConnectionString 的名称,然后选择"下一 步"。

  6. 选择“完成”。

    显示"配置Visual Studio摘要的Azure 存储屏幕截图。

创建将用于存储电子邮件指标的新模型类

  1. 在"解决方案资源管理器"工具窗口中,右键单击 "模型"文件夹并选择"添加>类"。

    显示如何Visual Studio在 models 文件夹中右键单击来添加新类的屏幕快照。

  2. 在"添加新项"对话框中,选择 "类",将文件名称设置为 EmailMetric.cs, 然后选择"添加"。

  3. 将以下代码添加到刚创建的 EmailMetric 类。

    public string Email;
    public double RecipientsToEmail;
    

创建一个将计算和显示结果的新控制器

  1. 右键单击 Controllers 文件夹,然后选择"添加>控制器"。

  2. 在"添加基 架"对话框中,选择 "MVC 5 控制器 - 空", 然后选择"添加"。

  3. 当系统提示时,将控制器 命名 EmailMetricsController, 然后选择"确定 "。

  4. 在包含 EmailMetricsController 类的文件顶部的现有 using 语句后添加以下 using 语句。

    using System.Collections.Generic;
    using System.Configuration;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Web.Mvc;
    using Azure.Storage.Blobs;
    using Azure.Storage.Blobs.Models;
    using Newtonsoft.Json.Linq;
    
  5. 将以下代码添加到 EmailMetricsController 类。 这些将用于连接到包含导出 Azure 存储 的用户帐户。

    private const string connectionStringName = "AzureStorageConnectionString";
    private const string emailBlobName = "m365mails";
    
    
  6. 将以下方法添加到 EmailMetricsController 类。 这将处理 Azure Blob 并更新一个集合,该集合代表电子邮件帐户以及为提取的帐户找到的所有电子邮件中合并的收件人数。

    private async Task ProcessBlobEmails(List<Models.EmailMetric> emailMetrics, BlobClient emailBlob)
    {
        using (var stream = new MemoryStream())
        {
            var response = await emailBlob.DownloadToAsync(stream);
            var pos = stream.Seek(0, SeekOrigin.Begin);
    
            using (var reader = new StreamReader(stream))
            {
    
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    var jsonObj = JObject.Parse(line);
    
                    // extract sender
                    var sender = jsonObj.SelectToken("Sender.EmailAddress.Address")?.ToString();
                    // No sender - skip this one
                    if (string.IsNullOrEmpty(sender)) continue;
    
                    // extract and count up recipients
                    var totalRecipients = 0;
                    totalRecipients += jsonObj.SelectToken("ToRecipients")?.Children().Count() ?? 0;
                    totalRecipients += jsonObj.SelectToken("CcRecipients")?.Children().Count() ?? 0;
                    totalRecipients += jsonObj.SelectToken("BccRecipients")?.Children().Count() ?? 0;
    
                    var emailMetric = new Models.EmailMetric();
                    emailMetric.Email = sender;
                    emailMetric.RecipientsToEmail = totalRecipients;
    
                    // if already have this sender...
                    var existingMetric = emailMetrics.FirstOrDefault(metric => metric.Email == emailMetric.Email);
                    if (existingMetric != null)
                    {
                        existingMetric.RecipientsToEmail += emailMetric.RecipientsToEmail;
                    }
                    else
                    {
                        emailMetrics.Add(emailMetric);
                    }
                }
            }
        }
    }
    
  7. 将以下方法添加到 EmailMetricsController 类。 这将枚举指定帐户的Azure 存储容器中的所有 blob,并将每个 blob 发送到上一步中添加 ProcessBlobEmails() 的方法。

    private async Task<List<Models.EmailMetric>> ProcessBlobFiles()
    {
        var emailMetrics = new List<Models.EmailMetric>();
        var connectionString = ConfigurationManager.ConnectionStrings[connectionStringName];
    
        // Connect to the storage account
        var containerClient = new BlobContainerClient(connectionString.ConnectionString, emailBlobName);
    
        foreach (var blob in containerClient.GetBlobs())
        {
            if (blob.Properties.BlobType == BlobType.Block &&
                // Don't process blobs in the metadata folder
                !blob.Name.StartsWith("metadata/"))
            {
                var blobClient = containerClient.GetBlobClient(blob.Name);
                await ProcessBlobEmails(emailMetrics, blobClient);
            }
        }
    
        return emailMetrics;
    }
    
  8. 将以下操作添加到 EmailMetricsController, 它将使用添加此类的方法处理电子邮件并将结果发送到视图。

    [HttpPost, ActionName("ShowMetrics")]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> ShowMetrics()
    {
        var emailMetrics = await ProcessBlobFiles();
    
        return View(emailMetrics);
    }
    

为 EmailMetrics 索引操作创建新视图

  1. 在"解决方案资源管理器"工具窗口中,右键单击"视图 ">"EmailMetrics" 文件夹,然后选择"添加>视图"。

  2. 在"添加新基架项目"对话框中,选择 "MVC 5 视图",然后选择"添加 "。

  3. 在"添加视图" 对话框中,将"视图 名称"设置为 "索引",将其余输入控件保留为默认值,然后选择"添加 "。

    显示如何添加Visual Studio索引的新视图的用户界面屏幕截图。

  4. Index.cshtml 中新的 Views > EmailMetrics >中的 标记更新为以下内容。 这将添加一个表单,该表单具有一个按钮,该按钮将 HTTP POST 提交到上一步中添加的自定义控制器操作。

    @{
    ViewBag.Title = "Index";
    }
    
    <h2>Email Metrics</h2>
    
  5. 此应用程序将查看提取到 Azure Blob 存储 帐户的电子邮件的电子邮件数据,并显示每个发件人的收件人总数。

    @using (Html.BeginForm("ShowMetrics", "EmailMetrics", FormMethod.Post))
    {
    @Html.AntiForgeryToken()
    <div>
        <button type="submit">View email metrics</button>
    </div>
    
    <div>
        <em>Please be patient as this can take a few moments to calculate depending on the size of the exported data...</em>
    </div>
    }
    

为 EmailMetrics ShowMetrics 操作创建新视图

  1. 在"解决方案资源管理器"工具窗口中,右键单击"视图 ">"EmailMetrics" 文件夹,然后选择"添加>视图"。

  2. 在"添加视图" 对话框中,设置以下值,将其余输入控件保留为默认值,然后选择"添加 "。

    • 视图名称:ShowMetrics

    • 模板:列表

    • Model 类:EmailMetric (EmailMetric.Models)

      显示如何添加Visual Studio ShowMetrics 的新视图的屏幕快照。

    提示

    如果你看不到下拉框中的 EmailMetric 模型,请生成解决方案。

  3. ShowMetrics.cshtml 中新的 Views > EmailMetrics >中的 标记更新为以下内容。 这将显示计算结果。

    @model IEnumerable<EmailMetrics.Models.EmailMetric>
    
    @{
    ViewBag.Title = "ShowMetrics";
    }
    
    <h2>Email Metrics</h2>
    
    <table class="table">
    <tr>
        <th>Sender</th>
        <th>Number of Recipients</th>
    </tr>
    
    @foreach (var item in Model)
    {
    <tr>
        <td>@Html.DisplayFor(modelItem => item.Email)</td>
        <td>@Html.DisplayFor(modelItem => item.RecipientsToEmail)</td>
    </tr>
    }
    
    </table>
    

更新导航以具有到达新控制器的方法

  1. 在" 解决方案资源管理器 "工具窗口中,找到并打开文件 Views > Shared > Layout.cshtml

  2. 用以下代码替换内容。

    <!-- new code -->
    <li>@Html.ActionLink("Email Metrics", "Index", "EmailMetrics")</li>
    

测试应用程序

  1. 在Visual Studio中,选择"调试 >开始调试"。

  2. 构建应用程序并加载到新的浏览器窗口中时,选择顶部导航栏中的"电子邮件指标"项。

  3. 在" 电子邮件指标" 页上,选择" 查看电子邮件指标" 按钮。

    显示"查看电子邮件 ASP.NET 按钮的内置 Web 应用程序界面屏幕截图。

  4. 加载页面时,你将看到在所有电子邮件中找到的电子邮件地址列表,其中包含在两者之间发送的所有收件人的总和,如下图测试电子邮件提取中的一个小示例集所示。

    显示查看电子邮件 ASP.NET 结果的内置 Web 应用程序界面屏幕截图。