Каков наилучший способ сохранить данные фотографии между страницами? - PullRequest
0 голосов
/ 18 октября 2019

Я настраиваю веб-приложение, которое извлекает данные пользователя через стороннего поставщика удостоверений (Azure AD). Чтобы получить фотографию пользователя, мне, кажется, нужно сделать вызов API, используя его токен доступа. Как только я получу его, какой лучший способ сохранить / сохранить его для отображения в каждом представлении, к которому они переходят?

Пока что единственный известный мне способ работы с точки зрения показа их фотографии - это позвонить по телефону. API-интерфейс Microsoft Graph, чтобы получить фотографию в виде потока памяти, преобразовать ее в массив байтов, а затем сохранить ее в виде базовой строки 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 и даже не уверен, является ли сеанс лучшим способом хранения / получения фотографии, поэтому я открыт для предложений и альтернатив.

1 Ответ

2 голосов
/ 18 октября 2019

В вашем коде сеанса вы выводите строку sessionPhoto вместо фактического содержимого base64.

Вы должны обновить свой код, чтобы записать значение sessionPhoto, предварительно ожидая @:

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

Вы сможете увидеть проблему, просмотрев исходный код вашей получившейся страницы.

...