我有一个控制台应用程序,可以将作业上传到云中运行的工作人员。该应用程序连接到Azure存储并将一些文件上载到blob并将一些消息放入队列。目前,我正在使用开发存储。我实际上想知道我的客户端应用程序连接到存储的状态。即使我根本没有任何连接,我可以创建一个queueClient吗?它在哪一步实际上尝试发送一些网络包?我实际上需要某种机制来检查存在连接的存在和存储帐户的有效性。
答案 0 :(得分:3)
在您调用存储上的命令之前,客户端不会发送任何消息 - 例如直到你试图获取或放置blob,容器或队列的属性 - 例如在下面的示例代码中(来自http://msdn.microsoft.com/en-us/library/gg651129.aspx),然后在3个特定位置发送消息:
// Variables for the cloud storage objects.
CloudStorageAccount cloudStorageAccount;
CloudBlobClient blobClient;
CloudBlobContainer blobContainer;
BlobContainerPermissions containerPermissions;
CloudBlob blob;
// Use the local storage account.
cloudStorageAccount = CloudStorageAccount.DevelopmentStorageAccount;
// If you want to use Windows Azure cloud storage account, use the following
// code (after uncommenting) instead of the code above.
// cloudStorageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=http;AccountName=your_storage_account_name;AccountKey=your_storage_account_key");
// Create the blob client, which provides
// authenticated access to the Blob service.
blobClient = cloudStorageAccount.CreateCloudBlobClient();
// Get the container reference.
blobContainer = blobClient.GetContainerReference("mycontainer");
// Create the container if it does not exist.
// MESSAGE SENT
blobContainer.CreateIfNotExist();
// Set permissions on the container.
containerPermissions = new BlobContainerPermissions();
// This sample sets the container to have public blobs. Your application
// needs may be different. See the documentation for BlobContainerPermissions
// for more information about blob container permissions.
containerPermissions.PublicAccess = BlobContainerPublicAccessType.Blob;
// MESSAGE SENT
blobContainer.SetPermissions(containerPermissions);
// Get a reference to the blob.
blob = blobContainer.GetBlobReference("myfile.txt");
// Upload a file from the local system to the blob.
Console.WriteLine("Starting file upload");
// MESSAGE SENT
blob.UploadFile(@"c:\myfiles\myfile.txt"); // File from local storage.
Console.WriteLine("File upload complete to blob " + blob.Uri);
检查您是否具有连接性的一种方法是在已知容器上使用某些简单函数,如CreateIfNotExist()
或GetPermissions()
- 这些为您提供了一种检查连接的简单快捷方法。您还可以使用BlobRequestOptions指定超时以确保您的应用不会挂起(http://msdn.microsoft.com/en-us/library/ee772886.aspx)
小心不要太频繁地检查连接 - 每10000次成功检查将花费您0.01美元
答案 1 :(得分:1)
除了Stuart上面所写的内容之外,您可以尝试使用CloudQueueClient.ListQueuesSegmented
方法(http://msdn.microsoft.com/en-us/library/ff361716.aspx)从您的存储帐户中列出1个队列。我们真的对结果不感兴趣。我们更感兴趣的是,如果我们获得存储客户端异常,如果凭据不正确,您将获得该异常。即使您的存储帐户中没有队列,只要您通过了正确的凭据,您就不会收到错误。
我不认为创建一个对象是测试存储帐户凭据的正确方法。在过去,我们已经看到存储帐户只读的情况,即使您传递有效凭据并尝试通过创建对象来查看凭据是否正确,您也会收到错误。
希望这有帮助。
答案 2 :(得分:0)
这是我们检查连接是否准备就绪的方法:
public async Task<bool> IsReady()
{
var options = new BlobRequestOptions { ServerTimeout = TimeSpan.FromSeconds(2), MaximumExecutionTime = TimeSpan.FromSeconds(2) };
var container = GetStorageClient().GetContainerReference("status");
var blobRef = container.GetBlockBlobReference("health-check");
try
{
await blobRef.DownloadTextAsync(null, options, null);
}
catch (StorageException e)
{
if (e.RequestInformation.HttpStatusCode != 404)
return false;
try
{
await container.CreateIfNotExistsAsync(options, null);
await blobRef.UploadTextAsync("health check", AccessCondition.GenerateEmptyCondition(), options, null);
}
catch (Exception)
{
return false;
}
}
return true;
}
它的作用:
注意:使用“冷”存储时,使用“其他操作”会更便宜。参见https://azure.microsoft.com/en-us/pricing/details/storage/blobs/