我们有一个处理外部回调的网络应用程序。为了将我们的应用程序与外部服务隔离,我们使用azure blob存储回调数据(.json)并将消息放入Azure Service总线,以便稍后获取处理服务。 以下代码用于将数据写入blob存储:
var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("MyStorage"));
var blobClient = storageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference("containername");
var dataFileName = Guid.NewGuid().ToString();
var blockBlob = container.GetBlockBlobReference(dataFileName);
blockBlob.UploadText(data);
blockBlob.Properties.ContentType = "application/json";
blockBlob.SetProperties();
var connectionString = CloudConfigurationManager.GetSetting("serviceBusCS");
var queueName = "MyQueue";
var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
var payload = new MyCustomMessage {
Id = dataFileName
};
var message = new BrokeredMessage(payload);
client.Send(message);
在处理方面,我们有一个Web作业,一次读取一个消息并检索数据如下:
var storageAccount = CloudStorageAccount.Parse("MyCS");
var blobClient = storageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference("containername");
var blockBlob = container.GetBlockBlobReference(message.Id);
if (blockBlob == null) {
return;
}
if (!blockBlob.Exists()) {
return; ==> FAILS HERE
}
// Process the message here...
// Once the processing is done, delete the blob
这种设计在大多数情况下运作良好,但我们从现在开始使用404-NotFound(上面标有FAILED HERE
)。
问题
此代码失败的唯一方法是使用两个具有相同文件名的消息,即:相同的GUID几乎是不可能的,或者我错过了什么? 知道为什么无法找到blob数据吗?
编辑1
从Azure门户中搜索丢失的blob表明blob实际上并不存在。
如果无法将数据写入blob容器,是否应该blockBlob.UploadText(data);
抛出?
编辑2
感谢杰森指出去哪里看。我们抓取了我们的日志,发现blob已成功写入。 Web作业启动并处理消息,但一分钟后,恰好一分钟后,我们看到Web作业开始尝试再次处理同一消息,但它无法找到预期作为第一次运行的blob清除blob并删除它。
答案 0 :(得分:1)
如果客户端应用程序从服务器收到HTTP 404(未找到)消息,则表示客户端尝试使用的对象(例如实体,表,blob,容器或队列)不存在于存储服务。这有很多可能的原因,例如: •客户端或其他进程先前已删除该对象 •共享访问签名(SAS)授权问题 •客户端JavaScript代码无权访问该对象 •网络故障
有关详细信息,请参阅Storage Monitoring, Diagnosing and Troubleshooting Guide。