normalian blog

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

Windows Azure メディアサービス ネタ その3 〜 認証プロキシ越の動画アップロード 〜

今までも以下の様に Windows Azure メディアサービスに関する情報を記載させて頂いた。

今回は、認証プロキシを経由して Windows Azure メディアサービスに動画ファイルをアップロードする方法について紹介する。

概要

Windows Azure メディアサービスは動画ファイルをブロブストレージ(Windows Azure のクラウドストレージの一種)に格納するため、API の内部でブロブコンテナに格納する REST API も利用している。内部では System.Data.Services.Client.DataServiceContext を利用しているため、http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/7e18b3c2-848a-4296-933e-983779c46de9 の記事を参考に次のサンプルコードを作成した。

サンプルコード

以下に、認証プロキシを超えて Windows Azure メディアサービスに動画をアップロードするサンプルコードを記載する。System.Net.HttpWebRequest.DefaultWebProxy を利用してデフォルトで使用するプロキシサーバを変更し、認証情報を System.Net.NetworkCredential で設定する。System.Net.HttpWebRequest.DefaultWebProxy で設定を変更すると、他のWebリクエストも同様のプロキシ設定を利用するので注意が必要だ(nullを代入するとプロキシ設定は無効化される)。

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.MediaServices.Client;

namespace ConsoleApplication1
{
    class Program
    {
        private readonly static string _accountName = "<メディアサービスアカウント名>";
        private readonly static string _accountKey = "<メディアサービスのアカウントキー>";

        static void Main(string[] args)
        {
            Console.WriteLine("Main() start");
            System.Net.HttpWebRequest.DefaultWebProxy =
                new System.Net.WebProxy(@"<認証プロキシのURL>",
                    true,
                    null,
                    new System.Net.NetworkCredential("<ユーザ名>", "<パスワード>"));
            UploadMediaFile();
            Console.WriteLine("Main() end");
            Console.ReadLine();
        }

        public static void UploadMediaFile()
        {
            string filePath = @"C:\Temp\何かの動画.wmv";
            var context = new CloudMediaContext(_accountName, _accountKey);
            var iAsset = context.Assets.Create("認証プロキシ経由のアセット", AssetCreationOptions.None);
            var assetFile = iAsset.AssetFiles.Create(Path.GetFileName(filePath));
            assetFile.UploadProgressChanged += assetFile_UploadProgressChanged;

            Console.WriteLine("upload start");
            assetFile.Upload(filePath);
            Console.WriteLine("upload end");
        }

        static void assetFile_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
        {
            Console.WriteLine("★ {0}% uploaded. {1}/{2} bytes", e.Progress, e.BytesUploaded, e.TotalBytes);
        }
    }
}