.NET Framework 2.0 Configuration ツールで設定するのかと思っていたら、Web.config 経由だったのが判明。
そこに至るまでには Essiential .NET を読み返し、
ASP.NET動作専用のアカウントで caspol -resolveperm 〜\Bin\App_Code.dll とやって
アクセスを許可する = <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true"/>
としか出ないなあとか無駄な調査をやっていた。
ビジネスロジックもプレゼンテーションも自力開発する際は、ビジネスロジックのDLLを 特権コードをサンドボックス化する に従って 公開メソッドで必要な権限は 「SecurityAction.Assert を使って呼び出し元の権限はチェックしない」にしておく。 でもって ビジネスロジックのDLL をGACにインストールしてしまえば、「GACにあるものはデフォルトでFullTrust」なので 動作するようになる。という方針が一番簡単そうだ。
log4net.dll に関しては StrongName に対する FileIOPermisson を定義したポリシーを設定してログの書き込み先を制限しといた方がいいかも?
しかし何の設定もしてない状況だった時 ローカルAdministrator で動かすと拒否されないのに、 IIS_WPG グループに参加しているASP.NET動作専用のアカウントで動かすと拒否される理由は未だにさっぱり分からん。
dotTrace Profiler だけのつもりだったけど、ReSharper 2.0 へのアップグレード権つきで+$50だったら買っちゃえみたいな。
1月15日まで。
VisualStudio.NET対策のために .svn の代わりに _svn を利用していた環境について
NEW: Setting the environment variable SVN_ASP_DOT_NET_HACK makes TSVN use '_svn' as the Subversion admin dirs instead of '.svn'. A restart of Windows is required for this to take effect. (Stefan)
これで TortoiseSVNの配布物がひとつになった。素晴らしい。
ASP.NET内で発生したエラーはとにかく詳細に記録する、ってのを Global.asax に記述してみた。
void Application_Error(object sender, EventArgs e)
{
System.Text.StringBuilder str = new StringBuilder();
str.Append("Path: "); str.Append(Request.Path); str.Append("\r\n");
str.Append("User: "); str.Append(HttpContext.Current.User.Identity.Name); str.Append("\r\n");
str.Append("Request.Params::\r\n");
foreach (string key in Request.Params.Keys)
{
str.Append(key); str.Append("="); str.Append(Request.Params[key]); str.Append("\r\n");
}
str.Append("Session::\r\n");
foreach (string key in Session.Keys)
{
str.Append(key); str.Append("="); str.Append(Session[key].ToString()); str.Append("\r\n");
}
システムLogger.Error(str.ToString(), Server.GetLastError());
}
システムLoggerは例によって log4net のラッパー。
クラシックASPでIISのログに含まれる 500 を見つけて想像するよりは随分問題箇所の特定が楽だ。
Sessionに埋め込んだDataSetに関しては、ToString() メソッドをoverrideして追跡に必要な情報を出力するようにすると更によい。 partialクラス万歳。