我正在设置一个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应用程序还比较陌生,甚至不确定会话是否是存储/检索照片的最佳方法,因此我愿意提出建议和替代方案。
答案 0 :(得分:2)
在会话代码中,您正在输出字符串sessionPhoto
而不是实际的base64内容。
您必须通过在sessionPhoto
之前添加代码来更新代码以写入@
的值:
<img class="mr-2" src="data:image/jpeg;base64, @sessionPhoto" />
通过查看结果页面的源代码,您应该能够看到问题。