normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Page Blobに書き込んでみたい・・・、けど失敗中・・・orz

id:waritohutsu:20091216の日記で書いた内容では、「Page BlobとBlock Blobの種類を指定するタイミングが分からない」という記述をしていましたが、Page Blobの謎が少しだけ解けたので情報を展開します。

Page Blobの参照取得方法

「いつPage Blobと指定するのか分からない」と記述しましたが、、「Blobの参照取得時」または「Blobの新規作成時」にPage BlobかBlock Blobをきちんと指定するようです。

//Blob?の参照を取得
var blob = blobContainer.GetBlobReference(blobAddressUri);
//blob.ToPageBlobでPageBlobにも出来る

//Block Blobの参照を取得
var blockBlob = blobContainer.GetBlockBlobReference(blobAddressUri);

//Page Blobの参照を取得
var pageBlob = blobContainer.GetPageBlobReference(blobAddressUri);

CloudBlobContainer.GetXXXBlobReferenceメソッドは、「Blobの参照取得時」または「Blobの新規作成時」に利用されます。上記の3つのどれを使うかは、コード例から察するに以下のパターンかと思ってます。

Page Blobに対する書き込み方法

参照の取得方法は分かったので、実際にPage Blobに書き込みを行う方法を調査してみました。結果、Page Blobに対する書き込み方法は以下の方法が存在しました*2

  1. BlobStreamクラスを利用した書き込み
  2. CloudPageBlob.UploadText()メソッドを利用した書き込み
  3. CloudPageBlob.WritePage()メソッドを利用した書き込み
  4. CloudPageBlob.UploadByteArray()メソッドを利用した書き込み
  5. CloudPageBlob.UploadFile()メソッドを利用した書き込み
  6. CloudPageBlob.UploadFromStream()メソッドを利用した書き込み

作成したコード例を載せますが、現時点では全ての手法で書き込みが失敗しています…。求む!情報!!

コード例

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using System.Diagnostics;
using System.Text;
using System.IO;

public partial class _Default : System.Web.UI.Page
{
    protected void PageBlobButton_Click(object sender, EventArgs e)
    {
        //適当なUri
        string blobAddressUri = String.Format("text_aaaaaaaaaaaaaaaaaaaaaaaa.txt");

        //Page Blobの参照を取得
        var blob = blobContainer.GetPageBlobReference(blobAddressUri);

        //Page Blobを作成
        //この処理をしないと、ストレージ内にBlobが生成されない
        blob.Create(512 * 4);

        //BlobStreamクラスを利用した書き込み
        try
        {
            blob.Metadata["Title"] = TitleTextBox.Text;
            var blobStream = blob.ToPageBlob.OpenWrite(
                 new BlobRequestOptions()
                 {
                     BlobListingDetails = BlobListingDetails.All,
                     UseFlatBlobListing = true
                 });
            blobStream.WriteByte(Convert.ToByte(PageBlobTextBox.Text));
            blobStream.Commit();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }

        //CloudPageBlob.UploadText()メソッドを利用した書き込み
        try
        {
            blob.Metadata["Title"] = TitleTextBox.Text;
            blob.UploadText(
                PageBlobTextBox.Text,
                Encoding.UTF8,
                 new BlobRequestOptions()
                 {
                     BlobListingDetails = BlobListingDetails.All,
                     UseFlatBlobListing = true
                 });
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }

        //CloudPageBlob.WritePage()メソッドを利用した書き込み
        try
        {
            using (MemoryStream memoryStream =
                new MemoryStream(Encoding.UTF8.GetBytes(PageBlobTextBox.Text)))
            {
                blob.WritePages(memoryStream, 0);
                memoryStream.Seek(0, SeekOrigin.Begin);
                blob.WritePages(memoryStream, 2 * PageBlobTextBox.Text.Length);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
    }
    //(中略)

おまけ

Mackenzie NeilさんのブログにてBlock Blob、Page Blobへの処理が記述されています。こちらも参考にして頂けると幸いです。

*1:Blobインスタンス取得後、ToPageBlob or ToBlockBlobプロパティでBlobの種類を判別可能

*2:多分もっと書き込み方法は有ると思います