わかりました。webjobs SDK はまだベータ版ですが、かなりクールです。バインドしている実際のオブジェクトに到達するという点では、IBinder に少し苦労しています。当たり前かもしれませんが、もしそうなら許してください...
Webジョブで送信するメールを処理しています。それらはキューに入れられ、イベントをトリガーします。このコードは機能します..しかし、結果のブロブにアクセスして、成功した場合は削除し、失敗した場合は移動できると考えずにはいられません。
コードは次のとおりです。
public static void ProcessEmailBlob([QueueTrigger(Email.queueEmailsToSend) ] string blobname, IBinder binder)
{
TextReader inputfile = binder.Bind<TextReader>(new BlobAttribute(Email.blobEmailOutboxContainerAsPath+blobname));
string input = inputfile.ReadToEnd();
string connection = ConfigurationManager.ConnectionStrings["AzureJobsStorage"].ConnectionString;
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connection);
//Get create connect to the outbox blob
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(Email.blobEmailOutboxContainer);
CloudBlockBlob emailin = container.GetBlockBlobReference(blobname);
MailMessage smptmail = new MailMessage();
//ought to be able to JSONise this??
//smptmail = JsonConvert.DeserializeObject<MailMessage>(input);
smptmail = XmlMailMessage.MakeSMPTMessage(input);
bool success = Email.Send(smptmail);
if (success && emailin.Exists()) //If sending the email succeeded
{
emailin.Delete();
}
else
{ //The email failed or the blob doesn't exist which is also odd and bad
if (emailin.Exists())
{ //Then the file is ok.. store it in the Failed Email
CloudBlobContainer failedcontainer = blobClient.GetContainerReference(Email.blobEmailFailedContainer);
failedcontainer.CreateIfNotExists();
CloudBlockBlob failedmailblob = failedcontainer.GetBlockBlobReference(blobname); // use the same name just a different container
failedmailblob.StartCopyFromBlob(emailin);
}
else
{
//log something here
}
}
}
ご覧のとおり、blob のコンテンツを bind.Bind ピースで取得できますが、それを削除するには接続全体を行う必要があります..それは正しくありません..できますか?