首页 > 解决方案 > .NET Core 2.2 Razor Pages 网站模板以及如何缓存 MSFT Graph 调用

问题描述

我在 VS2019 中建立了一个简单的 ASP.NET Core 2.2 网站,并包含了Microsoft.Identity.Web项目,以使用 MSAL.NET 对 Microsoft Graph API 进行调用。

我已经成功地调用了图表,包括通过在文档上的示例应用程序的指导下注入和从/me顶部导航栏中的端点显示我的照片,如下所示:tokenAcquisitiongraphApiOperations

public async Task OnGet()
{
    var accessToken = await tokenAcquisition.GetAccessTokenOnBehalfOfUser(HttpContext, new[] { ScopeConstants.ScopeUserRead });        
    var photo = await graphApiOperations.GetPhotoAsBase64Async(accessToken);

    ViewData["photo"] = photo;
}

与模板站点一起,每个页面都引用了_layout.cshtml具有如下引用的文件_LoginPartial.cshtml

<ul class="navbar-nav">
    @if (User.Identity.IsAuthenticated)
    {
        <li class="nav-item">
            <a href="/AdminSettings">
                    <img class="circle-photo" src="data:image/jpeg;base64, @ViewData["photo"]" />
            </a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="AzureAD" asp-controller="Account" asp-action="SignOut">Sign out</a>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="AzureAD" asp-controller="Account" asp-action="SignIn">Sign in</a>
        </li>
    }
</ul>

我的问题:

我想在每个 Razor 页面上显示照片以及可能的其他 Graph 数据,而无需在每个页面上手动调用 Graph。由于这_LoginPartial.cshtml不是 Razor 页面,因此我无法将结果放入其中,@ViewData但我不知道另一种方式。/me让 Graph为每一页拉取数据似乎很浪费;更不用说糟糕的设计了。

有没有办法缓存结果并跨多个页面引用它们?

标签: c#asp.netasp.net-mvccachingrazor

解决方案


您可以在 ASPNET Core 中使用 <cache> taghelper,如此处所述

我很想使用“因查询而异”并将有问题的查询基于 usertoken/cookie 值,因此您仅在令牌过期时刷新。

<cache vary-by-query="Thing1,Thing2">
    <span>Some Stuff I need to cache</span>: @ViewData[MyStuff]
</cache>

我敢肯定,这可能对您有用。


推荐阅读