2012年1月16日月曜日

ASP.NET OracleProvidersによるフォーム認証がIIS上でうまくいかない

ASP.NETでは、各種認証機能がデフォルトで実装されている。とはいえそれはSqlServer用なので、Oracleで使用する場合はOracleProvidersをインストールする必要がある。

このインストール方法と使用方法についてはOracleから詳しいガイドが提供されているが、問題なのはこの通りにやった場合開発サーバー上ではうまく動くがIIS上ではうまく動かないということだ(後述するが、仮想パスの設定によってはうまく動く場合もある)。


上記ガイドの通りに設定しても、IIS上では永久にログインできない。IIS上でもまともに動くようにするには、web.configに設定されている各認証要素(membership・profile・roleManager)の設定を変更する必要がある。
具体的には、provider要素内のapplicationNameにサイト名を指定する。それと、ハッシュアルゴリズムにSHA1を設定しておく(これは必須かは分からない)。

<membership defaultProvider="SomeOracleMembershipProvider" hashAlgorithmType="SHA1" >
<providers>
<clear/>
<add name="SomeOracleMembershipProvider" type="Oracle.Web.Security.OracleMembershipProvider, Oracle.Web, Version=2.111.5.10, Culture=neutral, PublicKeyToken=89b483f429c47342" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" connectionStringName="ConnectionString" applicationName="/webSite" />
</providers>
</membership>

認証情報はサイト名(上記の場合webSite)で管理されている。そして、これは仮想パスによって検索されるようだ。
そのため、仮想パスが/webSiteであるならうまくいくが(開発サーバーでの起動はこれに該当)、サーバー上に配置して仮想パスがこれとずれた場合(app/webSiteなど)、認証情報が検索できずうまくいかないという現象が起こるらしい。
これを回避するには、明示的にアプリケーション名を指定しそちらで認証情報を取得するようにする・・・ということのようだ。

参考サイト


これを発見するのに丸一日費やした。ASP.NET+Oracleはかくも茨の道なのか・・・







2012年1月13日金曜日

ASP.NET Oracle Providers for ASP.NET設定時にconnectionStringでエラー

Oracle Providers for ASP.NETの設定時に、接続文字列関連のエラーが発生する場合、以下点をチェックする。

1.サーバー以外に、ローカルのmachine.configを編集しているか
通常はローカルのVisualStudioからASP.NETの構成を参照するので、ローカルのmachine.configを修正しないとまずアクセスが出来ない。※これとは別に、当然サーバー上の設定も必要。


2..NETフレームワークのバージョンは適切か
machine.configに該当の設定があるのは2.0と4.0の二つある。マニュアル上では2.0で紹介されているが、.NET Framework4.0を入れている場合そちらの修正が必要

参考ドキュメント(P104あたり)
Oracle Database 2日で.NET開発者ガイド(11g R2)

2012年1月11日水曜日

Oracle DBConsoleが起動しない場合の対処法

1.状況確認用コマンド
emctl status dbconsole

2.起動用コマンド
emctl start dbconsole 停止の場合startをstopに

3.リポジトリの再構築(方法が2つある?)
1.構成情報を再構築?
set oracle_sid=XXXXX(SID)
emca -deconfig dbcontrol db
emca -config dbcontrol db

2.構成情報を削除/再作成(1がうまくいかなかったときに試すと良い。これまでの設定が消えるらしいので要注意)
emca -deconfig dbcontrol db -repos drop
emca -config dbcontrol db -repos create

もしくは

emca -deconfig dbcontrol db
emca -config dbcontrol db -repos recreate

単純に削除しても失敗する場合は、SYSMANのユーザーなどを明示的にDROPする必要がある(参考のOracleDBConsoleの再構築参照)


4.参考
21 Enterprise Manager Configuration Assistant(EMCA)
OracleDBConsoleの再構築



2012年1月10日火曜日

ASP.NET WebFormでNUnitによるUnitTest環境を構築する

ASP.NET WebFormはUnitTestにすばらしく向いていないため、テスト駆動型開発の環境を整えるのは茨の道になる。試行錯誤しなんとかそれなりに出来たので、以下にその手順を記載します。

・前提
備え付けのMSTest(右クリック→テストケース作成)は使わない
→有料のProfessional以上でないと使用できず、また作成/テスト実行が異常に遅いため
(コード管理のTeamFoundationも有料だし、これでもうイヤと言われたら返す言葉は、ない)

AppCode内に単体テストケースは作成しない
→純粋に考えればこれが一番早いが、プロジェクトファイルが作れなくなるためNUnitの恩恵が受けられない+どの道aspx.vbのコードが参照できないため、あまり意味がない。
Slim3のkotoriのように、NUnitがWeb配置できるようになればこの道も開けるかもしれない。

Kotori Web JUnit Runner


・事前準備
NUnitのインストール(msiファイルをダウンロードして、あとはYESで大丈夫)

・テスト環境構築手順
1.テストプロジェクトの作成
Solution NavigatorでWebサイトを開き、ソリューションのところで
追加->新しいプロジェクト->クラスライブラリ」を選択し、テスト用プロジェクトを作成する。
※こうすること(ソリューションに追加する形で作成すること)で、テスト対象のWebサイトとテストプロジェクトがまとめて見られるようになる

2.Webサイト参照の作成
Webサイトをプリコンパイルし、テストプロジェクトから参照できるようにする。
この処理はバッチファイルで行うが、自動でやりたい!という場合以下2つの方法がある。
1.Webサイトのビルド後処理にプリコンパイル処理を入れる
2.テストプロジェクトのビルド前処理にプリコンパイル処理を入れる

プリコンパイルした内容は、テストプロジェクトのbin/TargetSiteに入れることにする(テストプロジェクトから参照できるならどこでも良い)。プリコンパイルのコマンドは以下の通り。
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe  -f -d -fixednames -p <Webサイトの物理パス>-v / <テストプロジェクトの物理パス>\bin\TargetSite

環境は.NET4.0を想定している。付与しているオプションのポイントは下記点。
-f:ファイルが存在したら上書きするようにするオプション。
-d:デバッグを可能にするためのオプション
-fixednames:出力するdllの名前を固定にするオプション。こうしないと毎回参照を設定しなおさないといけなくなる。

プリコンパイル方法参考


3.テストプロジェクトの環境設定
プロジェクトのプロパティ>デバッグで、以下2点を設定
・外部プログラムの開始→インストールしたNUnitのexeを指定
・コマンドライン引数   →作成したプロジェクトのdllを指定(bin/Debug内にある)

プロジェクトのプロパティ>参照で、2で作成したサイトのBin内にあるdllを片っ端から参照設定。
あとは、NUnitのdll(bin/framework/nunit.framework.dll)を設定すれば準備OK。
※外部プログラムの開始の設定がない場合、プロジェクトファイルを直接編集

VisualStudioとNUnitの連動設定 

さらに、web.configの設定を読み込むようにしておく。
NUnitのTools→Setting→Test Loader→Assembly Isolationについて、Default Domain UsageのUse a Separate AppDomain per Assemblyにチェックを入れる。
web.configを<テストプロジェクト>/bin/Debugの配下にコピーし、名前をテストプロジェクト名.dll.configに変更する

NUnitからweb.configを読み込む方法


4.テストの作成/実行
やり方はNUnitの普通のテストケース作成と変わらない。
Webサイトの参照を通しているので、ページ内のパブリックメソッドなどもテスト可能。
ただ、方針としてはaspx/aspx.vbにあまり重たい処理は持たせない方が良い。イベントハンドリング処理のみとして、実際の実装はクラスオブジェクトで行ったほうが良い(MVPパターンを参照)

MVPパターンの例
※サイトは英語だが、色々見て回った中で一番分かりやすかった。


最後に、環境構築のバッチの例を。


@echo off
setlocal
REM テスト対象のサイトと、サイトのコンパイル結果のコピー先を指定。コピー先は、bin直下の必要あり
set TARGET_SITE=\\app\webSite
set UNIT_TEST_PJ=D:\unitTest\webSiteTest\bin\TargetSite
set PJ_NAME=webSiteTest


echo 【指定されたwebサイトのコンパイルを開始します】
REM オプションについては下記サイトを参照
REM http://msdn.microsoft.com/ja-jp/library/ms229863.aspx
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -f -d -fixednames -p %TARGET_SITE% -v / %UNIT_TEST_PJ%


echo 【サイトのweb.configをテスト環境にコピーします】
REM コピー先に移動
cd /d %UNIT_TEST_PJ%
REM コピー先はbin直下、という前提に基づきweb.configをbin/Debugへ移動
copy /y web.config ..\Debug\%PJ_NAME%.dll.config


echo 【テスト環境の構築が終了しました】


endlocal