C# 如何重用从WebClient.OpenRead(URL)返回的流
我正在为我的团队开发一个简单的实用程序,用于从URL下载图像并将其推送到azure存储blob。我让它工作得很好,但是如果我尝试推送多个blob,第二次和第三次推送只会推送一个空图像。它使其成为blob,但图像长度为0字节。 我得到的流数据如下所示:C# 如何重用从WebClient.OpenRead(URL)返回的流,c#,azure,azure-storage-blobs,webclient,C#,Azure,Azure Storage Blobs,Webclient,我正在为我的团队开发一个简单的实用程序,用于从URL下载图像并将其推送到azure存储blob。我让它工作得很好,但是如果我尝试推送多个blob,第二次和第三次推送只会推送一个空图像。它使其成为blob,但图像长度为0字节。 我得到的流数据如下所示: private Stream GetImageStream(string imageName) { url = "http://example.com/imageIwantToDownload.jpg"
private Stream GetImageStream(string imageName)
{
url = "http://example.com/imageIwantToDownload.jpg"
WebClient webClient = new WebClient();
webClient.Headers.Add("Authorization", "Bearer " + token);
var stream = webClient.OpenRead(new Uri(url));
if (stream != null)
{
stream.ReadTimeout = 500000;
return stream;
}
}
List<string> connectionStringList = new List<string>
{
ConfigurationManager.AppSettings.Get("UT_CDN_CONNECTION_STRING"),
ConfigurationManager.AppSettings.Get("QA_CDN_CONNECTION_STRING"),
ConfigurationManager.AppSettings.Get("PROD_CDN_CONNECTION_STRING")
};
foreach (var connectionString in connectionStringList)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer containerClient = blobClient.GetContainerReference("v1.0/images");
CloudBlockBlob cloudBlockBlob = containerClient.GetBlockBlobReference(imageName);
cloudBlockBlob.UploadFromStream(imageStream);
}
然后,要推送到blob存储,我正在使用Microsoft.WindowsAzure.storage(由于使用.net 461),并执行以下操作:
private Stream GetImageStream(string imageName)
{
url = "http://example.com/imageIwantToDownload.jpg"
WebClient webClient = new WebClient();
webClient.Headers.Add("Authorization", "Bearer " + token);
var stream = webClient.OpenRead(new Uri(url));
if (stream != null)
{
stream.ReadTimeout = 500000;
return stream;
}
}
List<string> connectionStringList = new List<string>
{
ConfigurationManager.AppSettings.Get("UT_CDN_CONNECTION_STRING"),
ConfigurationManager.AppSettings.Get("QA_CDN_CONNECTION_STRING"),
ConfigurationManager.AppSettings.Get("PROD_CDN_CONNECTION_STRING")
};
foreach (var connectionString in connectionStringList)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer containerClient = blobClient.GetContainerReference("v1.0/images");
CloudBlockBlob cloudBlockBlob = containerClient.GetBlockBlobReference(imageName);
cloudBlockBlob.UploadFromStream(imageStream);
}
但是我得到了一个错误,流不允许我去寻找。
我可以只做相同的webClient.OpenRead三次,然后在循环中读取相同的图像三次。但是有没有一种方法可以让我重用我已经拥有的流呢
谢谢 您可以参考以下代码,只需使用
imageStream.Position=0代码>:
foreach (var connectionString in connectionStringList)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer containerClient = blobClient.GetContainerReference("v1.0/images");
CloudBlockBlob cloudBlockBlob = containerClient.GetBlockBlobReference(imageName);
cloudBlockBlob.UploadFromStream(imageStream);
imageStream.Position = 0;
}
我做了一些测试,效果很好。所以当我尝试这个方法时,正如我在帖子中提到的,我得到了一个错误:这个流不支持seek操作。可能是因为我正在将CloudBlobContainer传递到一个方法中?可能是通过引用传递的?当我添加imageStream.SetLength(0)时代码>,它确实给出了一个错误,但只添加了imageStream.Position=0代码>,对我来说真的很有效。对我来说不是这样的!我的流是System.IO.stream类型。从System.Net.WebClient-.Net 461OK将流更改为内存流似乎可行:byte[]data=WebClient.DownloadData(新Uri(URL));返回新的内存流(数据);