Windows Azure の Full IIS で MachineKeyが上書きされる件

Windows Azure SDK 1.3 を使用してFull IISなWeb RoleをWindows Azure上に展開した際、Web.configに指定していたMachineKeyが上書きされる(IISによって自動設定される)という問題がありました。

※ただし最初の仮想サイトのみ。追加した仮想サイトや仮想アプリケーションは影響受けない(だったと思う)

さて、こちらの問題ですがこの間リリースされた Windows Azure SDK 1.4 では修正されているので、困ってた方はSDK 1.4を採用することも検討頂くといいのではないでしょうか。
他の問題もいろいろ修正されてるようですし。。。

ただまぁSDK1.2 以降でがらっと変わってる部分もあるので一概にOKとは言えないかもしれませんが。

ASP.NET MVCでデータアノテーションを多言語化する

今日ちょっとなやんでしばやん先生に即答してもらったのでメモ。

まずリソースファイルをPublicにしておきます。要確認。
リソースファイルのプロパティでカスタムツールを PublicResXFileCodeGenerator にしてビルドアクションで”埋め込まれたリソース”にしておきます。

あとはデータアノテーションのところでリソース指定するだけ。

例:ASP.NET MVCで既定で生成されるAccountModelなど

[Display(ResourceType = typeof(YOURNAMESPACE.App_GlobalResources.StringResources), Name = "ResUserName")]
public string UserName { get; set; }

超簡単ですね。

ASP.NET MVC3での多言語対応はこちらも参照。

ただこれやって発行したりするとリソースDLLはできてるんだけど読み込めないみたいなんですよね。なんでだろ。。まだ調べてる途中なのでわかったら追記等します。

2011.02.23 追記

いろいろ見てると以下の事がわかりました。

  • データアノテーションで記載したリソースへのアクセスだと問題ない。
  • ビュー等で@HttpContext.GetGlobalResourceObject("StringResources", "String1") といった形式でアクセスするとNullが返る

ということでGetGlobalResourceObjectが問題。Webアプリケーションの発行先にApp_GlobalResourcesフォルダ(と.resxファイル)があれば問題なく動作しますが、埋め込みリソースとしてビルドするとアセンブリに埋め込まれて(あとサテライトアセンブリが出来て)発行先にはApp_GlobalResourcesフォルダは含まれません。

で、この状態でGetGlobalResourceObject呼び出すとNGと。嵌ってた状況はこんな感じです。

じゃぁどうやってアクセスするんだ?というと単純にリソースは既にPublic化されているわけですから

@MvcApplication1.App_GlobalResources.StringResources.String1

みたいにしてあげればいいわけですね。やぁ長かったよ。

参考にしたサイトはこちら。

ゼロから始めるといろいろ壁にあたりますね~。

WCF Data Services の続き

前回のPOSTで書き忘れたこと。

インターセプターを使えば特定の列だけ値を変える等できます。OData and Authentication – Part 7 – Forms Authentication にも記載されていますが、たとえば認証されているときだけセンシティブな情報を返すとか。

認証ユーザーやロールに応じて1つのWCF Data Services で柔軟に操作範囲を変えたりできるのはすごく便利ですね。

あと忘れてましたがASP.NET開発環境だとうまくフォーム認証が動きませんでした。(.adxが見れない?)このあたりあまり情報なくてちょっと諦め気味…
面倒だけどデバッグはIISのワーカープロセスにアタッチする等したほうがいいのかも…?
またSQL Serverへの接続は手抜きですが、アプリケーションプールのユーザー等にアクセス権限無いと無駄に怒られますので注意。

最後に追加でいろいろリンクを置いておきます。

WCF Data Services で フォーム認証を利用する

ちと調べてて悩んでたので一応吐き出しておきます。

WCF Data Services を使うとOData形式等で強力なデータ連携が可能になります。
特に Entity Framework や LINQとの相性は抜群です。

でもむやみやたりにデータ公開したくないわけで。特にクラウドに置いたりする場合は。
じゃやっぱり認証かけたいよね、ということで今回は以下のケースで考えてみます。

  • 認証は必要だけど、最初だけの認証にしたい
  • クライアントアプリケーション内で(プログラムで)処理したいので、最初の認証以降はプログラム内で処理したい
  • フェデレーションもいいんだけど認証プロバイダも弄りたいというかカスタム認証プロバイダ使いたいです

イントラネット等でWindows統合認証が使えるならこんな苦労はないのかも知れませんが、プログラム内から操作する方法だと取れる手法は限られてきます。

で、今回はお手軽にフォーム認証を使って Cookie ベースで制限をかけたいと思います。(まぁなんというか、やってることは OData and Authentication – Part 7 – Forms Authentication と変わりません。)

※ Cookie ベースならまぁローカルに保存してても許してくれそうですし。

続きを読む

ASP.NET MVC3 RTM!

ASP.NET MVC3がやっとRTMになりました。(RTWじゃなくてRTMなんですね)

さて例によって Windows Azure 上でASP.NET MVC3を使おうとすると、アセンブリ参照をごそごそ追加してローカルコピーをTrueにしないといけないわけです。

※詳しくは 割と普通 さんの 記事「ASP.NET MVC3 RTMをWindows Azureで動かす!!~懇切丁寧な解説付き~」を参照ください

続きを読む

ASP.NET MVC3 RC2 と MVC,Entity Framework関連

自分用メモ。

基本からたたき直しが必要です。