#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 работает нормально, поэтому теперь вы должны найти, где в цепочке кодируется, это совершенно другой сценарий.