在页面之间保留照片数据的最佳方法是什么?

时间:2019-10-18 17:17:12

标签: c# html .net-core azure-active-directory microsoft-graph

我正在设置一个Web应用程序,该应用程序通过第三方身份提供者(Azure AD)检索用户数据。要获取用户的照片,我似乎需要使用他们的访问令牌进行API调用。一旦获得,保存/持久显示在他们导航到的每个视图中的最佳方法是什么?

到目前为止,据我所知,唯一能显示照片的方法是调用Microsoft Graph API来获取照片作为内存流,将其转换为字节数组,然后将其存储为base 64字符串,以后将被命名为img源。下面是实现该方法的代码。

var photoStream = await graphClient.Me.Photo.Content.Request().GetAsync();
byte[] photoByte = ((MemoryStream)photoStream).ToArray();
var sessionPhoto = Convert.ToBase64String(photoByte);
ViewData["photo"] = sessionPhoto;
session.SetString("photo", sessionPhoto);

我试图在会话中存储Base64String的最后一行是我先前寻找解决方案的一部分。但是,似乎从ViewData["photo"]中保存的数据创建图像的效果很好,而尝试从Session.GetString("photo")提取数据会导致图像损坏。

在_Layout视图中,我有:

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor

...

@if (ViewData["photo"] != null)
{
   <img class="mr-2" src="data:image/jpeg;base64, @ViewData["photo"]" />
}
else
{
    var sessionPhoto = HttpContextAccessor.HttpContext.Session.GetString("photo");
    if (sessionPhoto != null)
    {
        <img class="mr-2" src="data:image/jpeg;base64, sessionPhoto" />
    }
    else
    {
        <i class="fas fa-user-circle fa-3x mr-3"></i>
    }
}
...

我希望从ViewData [“ photo”]获取字符串将产生与从会话获取字符串相同的结果,但是,会话版本再次被破坏。另外,我对在.net core中制作Web应用程序还比较陌生,甚至不确定会话是否是存储/检索照片的最佳方法,因此我愿意提出建议和替代方案。

1 个答案:

答案 0 :(得分:2)

在会话代码中,您正在输出字符串sessionPhoto而不是实际的base64内容。

您必须通过在sessionPhoto之前添加代码来更新代码以写入@的值:

<img class="mr-2" src="data:image/jpeg;base64, @sessionPhoto" />

通过查看结果页面的源代码,您应该能够看到问题。