请纠正我的错误.从我对该主题的阅读到目前为止,在我看来,Azure Blob存储和文件服务都提供了存储文件和文件夹的能力(我知道blob可以存储任何二进制对象,但任何序列化二进制流只是一天结束时的文件),是一个模仿文件系统的层次结构.
只有访问它们的API略有不同,因为除了使用REST API之外,文件服务还允许您使用类似函数的Win32文件I/O查询源代码.
如果您希望应用程序存储应用程序用户拥有的某些文件,为什么还要选择另一个?
所以场景如下:
我有一个Web服务的多个实例,它将一大块数据写入Azure存储.我需要能够根据收到的时间将blob分组到容器(或虚拟目录)中.偶尔(最糟糕的每一天)旧的blob将被处理然后被删除.
我有两个选择:
选项1
我创建了一个名为"blobs"的容器(例如),然后将所有博客存储到该容器中.每个blob将使用目录样式名称,目录名称是接收时间(例如"hr0min0/data.bin","hr0min0/data2.bin","hr0min30/data3.bin","hr1min45/data.bin" ",...,"hr23min0/dataN.bin"等 - 每隔X分钟一个新目录.处理这些blob的事情将首先处理hr0min0 blob,然后处理hr0minX等等(并且在处理时仍然会写入blob).
选项2
我有许多容器,每个容器都有一个基于到达时间的名称(所以首先是一个名为blobs_hr0min0的容器,然后是blobs_hr0minX等),容器中的所有blob都是到达指定时间的那些blob.处理这些博客的事情将一次处理一个容器.
所以我的问题是,哪个选项更好?选项2是否为我提供了更好的并行化(因为容器可以位于不同的服务器中),或者选项1是否更好,因为许多容器可能导致其他未知问题?
如何在azure存储位置创建子容器.
请告诉我们
我创建了一个Azure存储帐户.我有一个400兆字节的.zip文件,我想将其放入blob存储空间供以后使用.
如果不编写代码,我怎么能这样做呢?那有什么接口吗?
我试图使用Azure MediaService API与一起Azure Storage API在API Service中主持Azure.
用户将视频流发送到服务HttpPost,服务将视频保存为我的存储帐户中的blob,媒体服务对视频进行编码,当视频链接准备就绪时,将其返回给用户.
但是,当我试图创建Asset一个System.NotSupportedException被抛出与消息:
抛出异常:Microsoft.Data.Services.Client.dll中的'System.NotSupportedException'抛出异常:mscorlib.dll中的'System.NotSupportedException'iisexpress.exe错误:0:Exception = System.NotSupportedException:此目标框架不支持您直接枚举数据服务查询.这是因为枚举会自动向数据服务发送同步请求.由于此框架仅支持异步操作,因此必须调用BeginExecute和EndExecute方法来获取支持枚举的查询结果.
我使用以下版本的所需依赖项:
Microsoft.Data.Services.Client - 5.6.2.0
Microsoft.WindowsAzure.MediaServices.Client - 3.0.0.8
Microsoft.WindowsAzure.Storage - 3.1.0.1
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
CloudMediaContext _context;
IAsset asset;
using (MemoryStream Ms = new MemoryStream(data.Data))
{
_context = new CloudMediaContext("accountName", "accountKey");
asset = await _context.Assets.CreateAsync("blobContainerName",
AssetCreationOptions.None,CancellationToken.None);
...
...
}
Run Code Online (Sandbox Code Playgroud)
在data.Data包含byte[]视频.CreateAsync调用时抛出异常.我试着_context.Assets.Create没有运气.
重要编辑
我创建了一个新的控制台应用程序,使用了我在API服务中使用的代码并且它已成功执行.所以问题出在API服务中.
这是我的类和方法定义
public class UploadController : ApiController
{
[HttpPost]
public …Run Code Online (Sandbox Code Playgroud) c# azure azure-storage-blobs async-await azure-media-services
每次我尝试为blob创建容器时都会出现异常
使用以下代码
CloudStorageAccount storageAccInfo;
CloudBlobClient blobStorageType;
CloudBlobContainer ContBlob;
blobStorageType = storageAccInfo.CreateCloudBlobClient();
//then I initialize storageAccInfo
ContBlob = blobStorageType.GetContainerReference(containerName);
//everything fine till here ; next line creates an exception
ContBlob.CreateIfNotExist();
Run Code Online (Sandbox Code Playgroud)
Microsoft.WindowsAzure.StorageClient.StorageClientException was unhandled
Message="One of the request inputs is out of range."
Source="Microsoft.WindowsAzure.StorageClient"
StackTrace:
at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result()
at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait()
at Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteImplWithRetry[T](Func`2 impl, RetryPolicy policy)
at Microsoft.WindowsAzure.StorageClient.CloudBlobContainer.CreateIfNotExist(BlobRequestOptions options)
at Microsoft.WindowsAzure.StorageClient.CloudBlobContainer.CreateIfNotExist()
at WebRole1.BlobFun..ctor() in C:\Users\cloud\Documents\Visual Studio 2008\Projects\CloudBlob\WebRole1\BlobFun.cs:line 58
at WebRole1.BlobFun.calling1() in C:\Users\cloud\Documents\Visual Studio 2008\Projects\CloudBlob\WebRole1\BlobFun.cs:line 29
at AzureBlobTester.Program.Main(String[] args) in C:\Users\cloud\Documents\Visual Studio 2008\Projects\CloudBlob\AzureBlobTester\Program.cs:line 19
at …Run Code Online (Sandbox Code Playgroud) 我知道Azure存储实体(blob,表和队列)具有内置的弹性,这意味着它们被复制到同一数据中心的3个不同服务器.最重要的是,它们也可以被复制到物理上位于不同地理区域的不同数据中心.出于所有实际目的,在这种情况下丢失数据的可能性接近于零.
但是,如果一个草率的开发人员(或者受酒精影响的开发人员))通过Azure门户或Azure存储资源管理器工具意外删除了存储帐户,会发生什么?最糟糕的是,如果黑客获取您的帐户并清除存储会怎么样?有没有办法检索已删除blob的千兆字节或是这样吗?不知何故,我认为必须有一个优雅的解决方案,Azure基础设施在这里提供,但我找不到任何文档.
我能想到的唯一解决方案是编写自己的流程(工作者角色),定期将我的整个存储备份到不同的订阅/帐户,从而大大增加了存储和交易成本.有什么想法吗?
问候,
阿尔奇尔
我正在开发一个ASP.Net MVC 4应用程序,我正在使用Azure Blob来存储我的用户要上传的图像.我有以下代码:
var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString);
var blobStorage = storageAccount.CreateCloudBlobClient();
//merchantKey is just a GUID that is asociated with the merchant
var containerName = ("ImageAds-" + merchant.merchantKey.ToString()).ToLower();
CloudBlobContainer container = blobStorage.GetContainerReference(containerName);
if (container.CreateIfNotExist())
{
//Upload the file
}
Run Code Online (Sandbox Code Playgroud)
一旦if语句被删除,我就会收到以下异常:
{"The remote server returned an error: (400) Bad Request."}
Run Code Online (Sandbox Code Playgroud)
我以为这是容器的名称,但我没有看到任何错误.连接字符串似乎创建了一个包含blob所有详细信息的良好存储空间.我不知所措.我研究了网络,每个人都说这是一个命名问题,但我发现它没有任何问题.
我使用的测试容器名称: imageads-57905553-8585-4d7c-8270-be9e611eda81
Container有以下uri: {http://127.0.0.1:10000/devstoreaccount1/imageads-57905553-8585-4d7c-8270-be9e611eda81}
更新:
我已将容器名称更改为just image,我仍然得到相同的异常.开发连接字符串如下:<add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />
azure blobstorage azure-storage azure-storage-blobs asp.net-mvc-4
我正在使用Azure存储来提供静态文件blob,但我希望在提供服务时为文件/ blob添加Cache-Control和Expires标头以降低带宽成本.
像CloudXplorer和Cerebrata的Cloud Storage Studio这样的应用程序提供了在容器和blob上设置元数据属性的选项,但在尝试添加Cache-Control时会感到不安.
有人知道是否可以为文件设置这些标头?