我正在使用Azure Storage来记录我的机器人和用户之间的对话。我希望将用户发送的附件存储在Azure Blob容器中。我以这种方式使用ContentUrl属性:
foreach (Attachment item in message.Attachments)
{
/// creo una sottodirectory in cui verranno salvate tutte le immagini con quel conversation Id, quindi di quella conversazione
CloudBlockBlob targetBlob = _alturasbotChatAttachmentBlobsContainer.GetBlockBlobReference("conv#" + message.Conversation.Id.ToLower() + "/" + item.Name);
/// carico il file dall'url datomi dall'utente
try
{
await targetBlob.StartCopyAsync(new Uri(item.ContentUrl));
}
catch (Exception e)
{
throw;
}
}问题是,在try-catch中,如果url不是绝对的url,就会抛出一个异常(例如,如果我插入来自google的图像url而不是contentUrl,一切都会正常工作)。也许ContentUrl在这种情况下不可用,因为它是本地地址。有办法解决这个问题吗?我是否必须使用Content属性(如果必须,如何使用?)谢谢
发布于 2018-04-12 18:53:12
部分回答了你的问题(因为我没有使用过Bot框架)。
从本质上讲,复制blob操作要求源项的URL应该是公开可访问的,因为复制操作是异步服务器端操作,并且Azure Storage应该能够在提交复制blob的请求后从源读取。这就是为什么你的代码工作时,你从谷歌的网址,并使用它而不是ContentUrl的附件。
由于我没有使用过Bot框架(因此我纯粹是在猜测),你可以做的一件事就是读取你试图在代码中作为流保存的附件的内容(不确定如何做到这一点),然后使用CloudBlockBlob.UploadFromStream方法上传blob。
发布于 2018-04-12 19:28:33
感谢回复的人。最后,我发现附件的内容是空的,所以我必须使用HttpClient来下载内容,然后我将文件上传到Azure Blob Container。现在它起作用了。对于最好奇的人:
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync(item.ContentUrl))
using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
{
await targetBlob.UploadFromStreamAsync(streamToReadFrom);
}
}发布于 2018-04-12 18:40:12
如果你阅读API参考,它直接告诉你,CloudBlockBlob使用一个绝对URI来做任何事情。
您可以在CloudBlob.StorageUri属性中找到URI
https://stackoverflow.com/questions/49794068
复制相似问题