Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重用从WebClient.OpenRead(URL)返回的流_C#_Azure_Azure Storage Blobs_Webclient - Fatal编程技术网

C# 如何重用从WebClient.OpenRead(URL)返回的流

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"

我正在为我的团队开发一个简单的实用程序,用于从URL下载图像并将其推送到azure存储blob。我让它工作得很好,但是如果我尝试推送多个blob,第二次和第三次推送只会推送一个空图像。它使其成为blob,但图像长度为0字节。 我得到的流数据如下所示:

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));返回新的内存流(数据);