Не удалось получить файл из хранилища больших двоичных объектов Azure с помощью SAS

#c# #azure-storage #azure-blob-storage

#c# #azure-хранилище #azure-blob-storage

Вопрос:

У нас есть веб-приложение, которое позволяет пользователям отправлять электронные письма. Каждое тело письма содержит изображение, представляющее блок подписи. Изображение хранится в хранилище больших двоичных объектов Azure в частном контейнере. Чтобы извлечь изображение из хранилища и поместить его в текст письма, поскольку электронное письмо создается пользователем, мы генерируем Uri, используя следующую функцию C #:

 public string GenerateBlobDownloadUri(string containerName, string blobName)
        {
            var policy = new SharedAccessBlobPolicy();

            // Get a reference to a container if it exists.
            var container = GetContainer(containerName, false);
            if (container == null)
                return string.Empty;

            // Retrieve reference to the blob
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
            if (!blockBlob.Exists())
                return string.Empty;

            policy.SharedAccessExpiryTime = DateTime.Now.AddYears(10);
            policy.Permissions = SharedAccessBlobPermissions.Read;

            var token = blockBlob.GetSharedAccessSignature(policy);

            return blockBlob.Uri   token;
        }
  

Используя эту функцию, мы можем успешно перенести изображение из Azure в тело нашего электронного письма во время создания электронного письма и корректно отобразить его.

Однако, если бы я посмотрел на базовый HTML-код электронного письма, скопировал сгенерированный Uri и вставил его в браузер, изображение не будет отображаться или загружаться. Я просто получаю сообщение Json о том, что изображение не найдено.

Фактически Uri, генерируемый вышеупомянутой функцией, выглядит следующим образом:

 https://xxxxx.blob.core.windows.net/winterscontainer/55-Email Signature Block.png?sv=2018-03-28amp;amp;sr=bamp;amp;sig=8zkwcK7naE+PZRfo6GtBYVfHJLzlCBLR6IaYymTIOGo=amp;amp;se=2030-10-17T12:30:56Zamp;amp;sp=r
  

Опять же, этот Uri работает из нашего приложения и корректно извлекает изображение и корректно отображается во время создания сообщения электронной почты. Однако при отправке электронного письма получатель просто видит заполнитель для изображения.

Если я вставлю Uri в свой браузер, я получу следующее:

 <Error>
<Code>ResourceNotFound</Code>
<Message>The specified resource does not exist. RequestId:4ca4e68b-b01e-0130-5781-a4a67e000000 Time:2020-10-17T12:33:33.0601864Z</Message>
</Error>
  

Комментарии:

1. Я не получаю последнюю часть this Uri works from within our application , а затем However, when the email is sent, the recipient just sees a placeholder for the image. . В чем разница в URI на этих двух этапах

2. @YegorAndrosov — В этом проблема, в Uri нет разницы.

3. Вы проверяли контейнер с помощью Azure Storage Explorer? Единственный вариант, который я вижу, — это то, что удаляет файл

4. часть запроса Uri была закодирована в HTML, посмотрите на те amp;amp; , которые должны быть amp;

5. @Gusman — Вы правы. Теперь я могу извлечь документ из браузера. Теперь мне нужно преобразовать их при отправке электронного письма. Если вы хотите записать это в качестве ответа, я проголосую за это и приму его.

Ответ №1:

Если вы проверите свой Uri, вы заметите что-то немного «странное» в части запроса, амперсанды преобразуются в HTML-объекты, а amp; не вы получаете amp;amp; . Что-то в цепочке, которая обрабатывает сообщение до тех пор, пока оно не поступит вашим клиентам (ваш api, почтовый сервер, веб-браузер, почтовый клиент … есть много возможностей), кодирует его (возможно, вы уже получили его в зашифрованном виде, но я сомневаюсь в этом, я также использую хранилище больших двоичных объектов Azure и никогдаполучил его в закодированном виде).

Если вы вручную расшифруете эти экранированные символы, вы заметите, что Uri работает нормально, поэтому теперь вы должны найти, где в цепочке кодируется, это совершенно другой сценарий.