Windows Azure SDK 1.3をインストールして、StorageClientを使ったWeb Roleアプリケーションを実行してエラーになっている方はいらっしゃいませんか?
実はSDK 1.3から Full IISになりWeb Roleの挙動が変わっています。
というのも、Storage ClientがRoleプロパティ(ServiceConfiguration.cscfgに定義されている)から接続文字列を読み出す際、今まではWebRole.cs( or .vb)のOnStartイベントハンドラ内にSetConfigurationSettingPublisherの振る舞いを追記していました。
新たなSDK及びFull IIS環境ではこの振る舞いが無視されてしまっていることにより、エラーが発生していました。
そのため、VSUG Day Winterのセッションでは一時的に「Page_Loadに書いてね」と暫定対策をお教えしましたが、ついに正式な対策法がAzure Teamのブログで公開されました。
正式な対策方法は「Global.asaxで定義せよ」です。
————————– 追記 ————————–
上でリンクしているAzure Team Blogを参照していただくと図入りで解説が出ていますが、RoleEntryPoint(WebRole.csなど)とWebアプリケーションコードがFull IIS環境では別アプリケーションドメインで実行されるために生じる問題であると書かれています。
@takekazuomi さん、Twitterでの補足ありがとうございました!
——————— 追記ここまで ———————
ということで、以下に手順を示します。
まず、従来のSDKで開発されたWeb RoleにはGlobal.asax自体がありません。そこで、Web RoleのプロジェクトにGlobal.asaxを新たに追加することから始めなければなりません。
Web Roleのプロジェクトでコンテキストメニューを表示し「追加」→「新しい項目」を選択し、「グローバルアプリケーションクラス」を追加します。
なお、SDK 1.3でプロジェクトを新規作成した場合にはあらかじめGlobal.asaxが含まれていますので、この作業は不要です。
そして、Global.asaxを開き、Application_Startメソッド内に以下のインプリメントを追加します。
{
CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSettingPublisher) =>
{
var connectionString = RoleEnvironment.GetConfigurationSettingValue(configName);
configSettingPublisher(connectionString);
});
}
続いて、WebRole.csのOnStart内に追記していたSetConfigurationSettingPublisherに関する記述はコメントアウトするか削除しておきましょう。
これで完了です。
[…] This post was mentioned on Twitter by Shinichiro Isago and Takekazu Omi, Tatsuaki Sakai. Tatsuaki Sakai said: ということで、日本語でも情報提供しておきました。 http://bit.ly/ifNfwk RT @tatsuakisakai: 一応動きますが、Gl […]