「Open棟梁 wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
参考 †
- 2章:「P層に関するトピック」も参考にして下さい。
- 7章:「FAQ」> 7.1節:「P層フレームワーク」も参考にして下さい。
導入前の質問 †
複数画面対応のWebアプリケーションに対応しているか? †
どのようなパターンでも対応可能です。また、ブラウザ・ウィンドウ別Session領域などの、複数画面対応のWebアプリケーション開発を支援する機能を活用できます。
クロス ブラウザに対応しているか? †
IE6 / 7 / 8、Firefox、Safari、Google Chrome、Operaで動作確認を取っています。しかし、SP、新バージョンについてはチェックし切れていない所もあります。以下、クロス ブラウザに於ける既知の制限事項になります。
- LinkButton?、ImageMap?など、hrefの__doPostBack?()メソッドを使用してポストバックするコントロールで 二重送信防止機能がIE6のみ有効にならないと言う制限事項があります。
インターネット系のシステムに於いて、Sessionタイムアウト時も処理を続行させたい。 †
Sessionの要件 †
- 近年のWebアプリケーションではメモリの大容量化、Sessionの冗長化構成対応により、イントラネット内の業務システムでは、Sessionの使用は一般的になっている。
- ASP.NET Web Forms用 P層フレームワークでは、Sessionを利用した処理方式を採用しているため、Session必須となっている。
- ASP.NET MVC用P層フレームワークでは、BtoCインターネット系Webシステムでの利用も想定し、Sessionは必須としていない。
Session無効化 †
ASP.NET Web Forms用 P層フレームワークでSessionタイムアウト検出機能と、Sessionを継続的に使用する必要のあるフレームワーク機能(下記参照)を全てOFFにすることで、インターネット系システムの要件にも対応できます。
負荷分散クラスタに於いてフェイル オーバー後、業務続行可能か? †
SQL Server、Oracle、いずれかのSessionモードを選択し、専用のSession状態保持用サーバを新設することでフェイル オーバー後、業務続行可能となります(Session状態保持用サーバは単一障害点となり得ますので、二重化できないStateServer?は選択肢から外しています)。StateServer?は同一サーバ内に立てることでサーバ メモリの有効活用やサーバ再起動時にも業務続行可能にすると言った信頼性向上に役立ちます。
マスタ ページの利用は必須か? †
- P層フレームワークの定義をマスタページに持つため必須です。
- P層フレームワークの定義以外(UI要素など)は、空のでも問題ありません。
マスタ ページのネストをサポートしているか? †
サポートしています。
以下のサンプルを動作させることによって
サポートされていることを確認可能です。
https://github.com/OpenTouryoProject/OpenTouryo/tree/develop/root/programs/C%23/Samples/WebApp_sample/ProjectX_sample/Aspx/testFxLayerP/nest
- testNestMasterScreen?.aspx
- testScreen1nest.aspx
- testScreen2nest.aspx
- 最新バージョンでは、コントロールのプレフィックスで コントロール(イベント)をハンドルするようになっています。
- ベースクラス2のコントロール取得処理や 中継イベント ハンドラをカスタマイズすることで、対応するコントロール・イベントを追加できます。
- 以下のドキュメント中の「P層イベント処理対応コントロール(イベント)の追加」を参照ください。
補足 †
- 動的に生成したコントロールのイベント ハンドラには、
個別にコントロール共通のイベントハンドラをセットします。
- 繰り返し項目の中で動的に生成されるコントロールは、
コントロール内部を再帰検索して、コントロール共通のイベントハンドラをセットします。
configファイルに指定する、コントロール毎のプレフィックスを空に指定すれば、P層イベント処理機能をキャンセルできます。
P層イベント処理機能はユーザ コントロールをサポートしているか? †
- サポートしています。
- ユーザ コントロールや、マスタ ページ上にP層イベント処理機能のイベント ハンドラを実装可能になりました。
- この際、ページ側とユーザ コントロールや、マスタ ページ側のコントロール名称が衝突しないようにプレフィックス追加など検討が必要になります。
IEキーイベント抑止 †
Enterキーでのsubmit抑止 †
現行の実装については下記を参照下さい。
下記のように、ブラウザに寄って動作が異なるようなので、
- IEでは、複数テキスト入力がある場合、そもそもEnterでサブミットされないが、
- Safari/Chromeでは複数テキスト入力がある場合も、Enterでサブミットされる。
コントロール毎にJavaScript?を記述した方が良いだろうという判断です(対策予定)。
トラブルシュート †
Sessionタイムアウト †
ログイン画面でSessionタイムアウト例外が発生する。 †
- P層フレームワークを使う場合は、Sessionを必要としますので、インターネット環境下等、DoS系攻撃が可能な環境下のログイン画面には、「Open 棟梁」のP層フレームワークを 使用したカスタム認証のログイン画面は使用しないようにするか、Windows認証やSiteMinder?等の認証基盤をご利用ください。未認証状態でのSession Cookie発行は問題とされています。
予期せぬSessionタイムアウト例外が発生する †
Sessionタイムアウト例外を発生させないようにSessionの解放を行うには、this.FxSessionAbandon()メソッドを使用して下さい。エラー画面でthis.FxSessionAbandon()メソッドが呼び出されています。
IFRAMEの更新後にIFRAME親画面の操作が出来なくなる。 †
- IFRAMEを使用している場合、IFRAME親画面の操作が出来なくなることがありました(ブラウザ、バージョンによる)。
- この現象は、特定のブラウザで、(IFRAME親)画面のreadyStateの値がcompleteにならず、interactiveになるため、二重送信防止機能により操作が抑止され続けることに起因します。
- このような現象が現れる場合は、当該(IFRAME親)画面を出力する際に、this.Form.Attributes.Remove("onSubmit");を呼び出し、二重送信防止機能を一時的にキャンセルすることで対策する必要があります。
以下の例外が発生する。 †
「System.ArgumentException?: 項目は既に追加されています。辞書のキー: 'SessionAbandonFlag?' 追加されるキー: 'SessionAbandonFlag?'」
SessionAbandonFlag?とは、
というものなので、エラー処理でエラーが発生して、エラーのループが発生している可能性が高いです。
エラー処理系のカスタマイズなどを行いましたでしょうか?
なお、ErrorScreen?.aspxは、MyBaseController?のベースクラスを継承したらダメです。
カスタムコントロール †
グリッド(データバインドコントロール)内で使用できるラジオボタン †
対応しています。以下を確認下さい。
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/CustomControl/Control/WebCustomRadioButton.cs#L190
カスタムコントロールにJavaScript?を仕込みたい。 †
方法 : ASP.NET Web サーバー コントロールにクライアント スクリプト イベントを追加する
https://msdn.microsoft.com/ja-jp/library/7ytf5t7k.aspx
上記を参考に、いくつか方法が考えられると思います。
- カスタムコントロール内部で
- this.Attributes.Add("JavaScript?イベントハンドラ(e.g.:onclick)", "JavaScript?コード or 関数");とする。
- this.OnClientClick? = "JavaScript?コード or 関数";とする(ボタン系のカスタムコントロールの場合)。
- JavaScript?関数をWebResource?.axdから取得する様に実装するとプロダクト風になりますが、難易度が高そうですし、SIの場合は柔軟性も損なわれます。
その他 †
HTMLのタイトルは何処で指定しているか? †
ベースクラス2のCMN_FormInit?メソッドで、this.Page.Titleに設定しています。必要に応じてカスタマイズ下さい。
リッチクライアント †
リッチクライアントに対応しているか? †
リッチクライアントに対応したP層フレームワークはWindows Formsのみのサポートとなります。
Windows FormsではP層イベント処理機能に対応させるコントロール・イベントが多くなり過ぎる。 †
ベースクラス2をカスタマイズする事でP層イベント処理機能に対応したコントロール・イベントの追加が可能ですが、WindowsForms?でサポートが必要なコントロール イベントが多い場合、カスタマイズ量が多くなるため、.NET標準のイベントハンドラから、隠しボタン(HiddenButton?) のDoClick?メソッドを呼び出し、Clickイベントを発生させることで、ログ出力や例外ハンドルの対象にできます。
また、この方法は、マルチプル・イベントやマルチキャスト・イベントに対応させる方法としても利用可能です(マルチプル・イベントやマルチキャスト・イベントには、.NETの標準イベント側で対応)。
Windows FormsのMenuItem?コントロールはP層イベント処理機能でサポートされているか? †
サポートされています。コントロールの検索方法が他と異なるためベースクラス2をカスタマイズせず 画面のロード処理(UOC_FormInit?)でMenuItem?のClickイベントに共通Clickイベント ハンドラ(Item_Click)を設定します。なお、同じ要領で、ベースクラス2をカスタマイズせず、 画面のロード処理(UOC_FormInit?)で共通イベント ハンドラ(Item_Click)を直接登録する事でP層イベント処理機能に対応させる事ができます。