「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>FAQ]]

*目次 [#qf3dd369]
#contents

*参考 [#c03f88d3]
-.NET用アプリケーション フレームワーク ”棟梁” 利用ガイド(ベターユース、FAQ編)~
https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/7_User_Guide(BetterUse_and_FAQ).doc

--2章:「P層に関するトピック」も参考にして下さい。
--7章:「FAQ」> 7.1節:「P層フレームワーク」も参考にして下さい。

*導入前の質問 [#k2522721]
**複数画面対応のWebアプリケーションに対応しているか? [#y77f3f87]
どのようなパターンでも対応可能です。また、[[ブラウザ・ウィンドウ別Session領域]]などの、複数画面対応のWebアプリケーション開発を支援する機能を活用できます。

**クロス ブラウザに対応しているか? [#r051ca97]
IE6 / 7 / 8、Firefox、Safari、Google Chrome、Operaで動作確認を取っています。しかし、SP、新バージョンについてはチェックし切れていない所もあります。以下、クロス ブラウザに於ける既知の制限事項になります。

-[[ダイアログ表示機能]]のうち、 [[業務モーダル・ダイアログ]]の表示のみIE限定と言う制限事項があります。
-[[OKメッセージ・ダイアログ]]、[[Yes/Noメッセージ・ダイアログ]]の表示はクロス ブラウザに対応しています(ただし、Operaはブラウザ自体がダイアログ未対応)。

-LinkButton、ImageMapなど、hrefの__doPostBack()メソッドを使用してポストバックするコントロールで [[二重送信防止機能]]がIE6のみ有効にならないと言う制限事項があります。

**インターネット系のシステムに於いて、Sessionタイムアウト時も処理を続行させたい。 [#h9ae9c92]

***Sessionの要件 [#mc8026dd]
-近年のWebアプリケーションではメモリの大容量化、Sessionの冗長化構成対応により、イントラネット内の業務システムでは、Sessionの使用は一般的になっている。
-ASP.NET Web Forms用 P層フレームワークでは、Sessionを利用した処理方式を採用しているため、Session必須となっている。
-ASP.NET MVC用P層フレームワークでは、BtoCインターネット系Webシステムでの利用も想定し、Sessionは必須としていない。

***Session無効化 [#h1c6f431]
ASP.NET Web Forms用 P層フレームワークで、

-[[Sessionタイムアウト検出機能]]と、
-Sessionを継続的に使用する必要のあるフレームワーク機能(下記参照)
--[[Session領域の自動削除機能]]
--[[ボタン履歴情報記録機能]]
--[[不正操作防止機能]]

を全てOFFにすることで、インターネット系システムの要件にも対応できます。

※ Sessionステートレスにできるが、一時利用があるので、~
 Session自体はON(<sessionState mode="Off"以外に設定)にしておく必要がある。

**負荷分散クラスタに於いてフェイル オーバー後、業務続行可能か? [#q7832944]
SQL Server、Oracle、いずれかのSessionモードを選択し、専用のSession状態保持用サーバを新設することでフェイル オーバー後、業務続行可能となります(Session状態保持用サーバは単一障害点となり得ますので、二重化できないStateServerは選択肢から外しています)。StateServerは同一サーバ内に立てることでサーバ メモリの有効活用やサーバ再起動時にも業務続行可能にすると言った信頼性向上に役立ちます。

**マスタ ページの利用は必須か? [#i38a00c1]
-P層フレームワークの定義をマスタページに持つため必須です。
-P層フレームワークの定義以外(UI要素など)は、空のでも問題ありません。

**マスタ ページのネストをサポートしているか? [#bb222e8a]
サポートしています。

以下のサンプルを動作させることによって~
サポートされていることを確認可能です。

https://github.com/OpenTouryoProject/OpenTouryo/tree/develop/root/programs/CS/Samples/WebApp_sample/WebForms_Sample/WebForms_Sample/Aspx/testFxLayerP/nest
- testNestMasterScreen.aspx
- testScreen1nest.aspx
- testScreen2nest.aspx

*[[P層イベント処理機能]] [#r4bb3dcb]
** [[P層イベント処理機能]]の対応コントロールを追加したい。 [#z3b33d47]
-最新バージョンでは、コントロールのプレフィックスで コントロール(イベント)をハンドルするようになっています。 
-[[ベースクラス2]]のコントロール取得処理や 中継イベント ハンドラをカスタマイズすることで、対応するコントロール・イベントを追加できます。

-以下のドキュメント中の「P層イベント処理対応コントロール(イベント)の追加」を参照ください。

--利用ガイド(纏め者編)~
https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/2_User_Guide(Leaders).doc
--利用ガイド(リッチクライアント編)~
https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/8_User_Guide(Rich_Client).doc

***補足 [#t0221801]
-動的に生成したコントロールのイベント ハンドラには、~
個別にコントロール共通のイベントハンドラをセットします。

-繰り返し項目の中で動的に生成されるコントロールは、~
コントロール内部を再帰検索して、コントロール共通のイベントハンドラをセットします。

**今回は、[[P層イベント処理機能]]をキャンセルしたい。 [#n96200dd]
configファイルに指定する、コントロール毎のプレフィックスを空に指定すれば、[[P層イベント処理機能]]をキャンセルできます。

**[[P層イベント処理機能]]はユーザ コントロールをサポートしているか? [#h9e0a6bd]
-サポートしています。
-ユーザ コントロールや、マスタ ページ上に[[P層イベント処理機能]]のイベント ハンドラを実装可能になりました。 
-この際、ページ側とユーザ コントロールや、マスタ ページ側のコントロール名称が衝突しないようにプレフィックス追加など検討が必要になります。

*IEキーイベント抑止 [#p467d69c]
**Enterキーでのsubmit抑止 [#wae5d5ca]
現行の実装については下記を参照下さい。

-ie_key_event.js#L236~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples/WebApp_sample/WebForms_Sample/WebForms_Sample/Scripts/touryo/ie_key_event.js#L236

下記のように、ブラウザに寄って動作が異なるようなので、

-フォームでのEnterキー押下について調べてみた - 130単位~
http://d.hatena.ne.jp/deeeki/20090516/formenterkey

--IEでは、複数テキスト入力がある場合、そもそもEnterでサブミットされないが、
--Safari/Chromeでは複数テキスト入力がある場合も、Enterでサブミットされる。

コントロール毎にJavaScriptを記述した方が良いだろうという判断です(対策予定)。

-Problem of suppress submit by pressing enter key.~
Issue #78 · OpenTouryoProject-OpenTouryo~
https://github.com/OpenTouryoProject/OpenTouryo/issues/78

*トラブルシュート [#t7d2619d]
**[[ファイル・ダウンロード処理の問題]] [#e13a1945]

**[[不正操作防止機能の誤検知]] [#e13a1945]

**[[別ウィンドウ表示機能、ダイアログ表示機能]] [#ka5ff50f]

**Sessionタイムアウト [#zc013a73]

***ログイン画面でSessionタイムアウト例外が発生する。 [#k83ee560]
-P層フレームワークを使う場合は、Sessionを必要としますので、インターネット環境下等、DoS系攻撃が可能な環境下のログイン画面には、「Open 棟梁」のP層フレームワークを 使用したカスタム認証のログイン画面は使用しないようにするか、Windows認証やSiteMinder等の認証基盤をご利用ください。未認証状態でのSession Cookie発行は問題とされています。

-なお、[[IsNoSessionフラグ]]をtrueに設定すると、当該画面でのみ[[ボタン履歴情報記録機能]]、[[不正操作防止機能]]をOFFにできるため、this.FxSessionAbandon()メソッドを実行して「Session.Abandonメソッドの実行」・「[[Sessionタイムアウト検出用Cookie]]の消去」を行ってログイン失敗時にSessionを消去し、例外を発生させず処理を続行可能です。

***予期せぬSessionタイムアウト例外が発生する [#k7d0d35c]
Sessionタイムアウト例外を発生させないようにSessionの解放を行うには、this.FxSessionAbandon()メソッドを使用して下さい。エラー画面でthis.FxSessionAbandon()メソッドが呼び出されています。

**IFRAMEの更新後にIFRAME親画面の操作が出来なくなる。 [#j5fcbe0c]
-IFRAMEを使用している場合、IFRAME親画面の操作が出来なくなることがありました(ブラウザ、バージョンによる)。
-この現象は、特定のブラウザで、(IFRAME親)画面のreadyStateの値がcompleteにならず、interactiveになるため、[[二重送信防止機能]]により操作が抑止され続けることに起因します。
-このような現象が現れる場合は、当該(IFRAME親)画面を出力する際に、this.Form.Attributes.Remove("onSubmit");を呼び出し、[[二重送信防止機能]]を一時的にキャンセルすることで対策する必要があります。

**以下の例外が発生する。 [#y99c234c]
「System.ArgumentException: 項目は既に追加されています。辞書のキー: 'SessionAbandonFlag' 追加されるキー: 'SessionAbandonFlag'」

SessionAbandonFlagとは、

-
 /// <summary>
 /// システムエラー発生時、セッション削除フラグをHttpContextに設定~取得するためのキー
 /// <summary>
 public const string SESSION_ABANDON_FLAG = "SessionAbandonFlag"; 
--https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Framework/Util/FxHttpContextIndex.cs
--https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples/WebApp_sample/WebForms_Sample/WebForms_Sample/Aspx/Common/ErrorScreen.aspx.cs

というものなので、エラー処理でエラーが発生して、エラーのループが発生している可能性が高いです。

エラー処理系のカスタマイズなどを行いましたでしょうか?

-ErrorScreen.aspx.cs~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples/WebApp_sample/WebForms_Sample/WebForms_Sample/Aspx/Common/ErrorScreen.aspx.cs

-MyBaseController.TransferErrorScreen~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Business/Presentation/MyBaseController.cs#L792

-MyBaseController.TransferErrorScreen2~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Business/Presentation/MyBaseController.cs#L813

なお、ErrorScreen.aspxは、MyBaseControllerのベースクラスを継承したらダメです。

*カスタムコントロール [#ybfb20d2]
**[[XSS対策の実装方針>脆弱性対策のポイント#x3c5804e]] [#d2adbd1f]

**グリッド(データバインドコントロール)内で使用できるラジオボタン [#a8a92d9a]
対応しています。以下を確認下さい。

https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/CustomControl/Control/WebCustomRadioButton.cs#L190

**カスタムコントロールにJavaScriptを仕込みたい。 [#q695ece2]
方法 : ASP.NET Web サーバー コントロールにクライアント スクリプト イベントを追加する~
https://msdn.microsoft.com/ja-jp/library/7ytf5t7k.aspx

上記を参考に、いくつか方法が考えられると思います。

-ASPタグにはHTMLの属性を直接、記述することもできるので、[[ToolboxData>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/CustomControl/Control/WebCustomButton.cs#L49]]に直書きする。

-カスタムコントロール内部で
--this.Attributes.Add("JavaScriptイベントハンドラ(e.g.:onclick)", "JavaScriptコード or 関数");とする。
--this.OnClientClick = "JavaScriptコード or 関数";とする(ボタン系のカスタムコントロールの場合)。

-JavaScript関数をWebResource.axdから取得する様に実装するとプロダクト風になりますが、難易度が高そうですし、SIの場合は柔軟性も損なわれます。
--c# - What is WebResource.axd - Stack Overflow~
http://stackoverflow.com/questions/3318092/what-is-webresource-axd
--Working with Web Resources in ASP.NET 2.0~
https://support.microsoft.com/en-us/kb/910442

*その他 [#ab0f7925]
**HTMLのタイトルは何処で指定しているか? [#od6ec1ab]
[[ベースクラス2]]のCMN_FormInitメソッドで、this.Page.Titleに設定しています。必要に応じてカスタマイズ下さい。

*リッチクライアント [#wd2e1f01]
**リッチクライアントに対応しているか? [#s7737b0c]
リッチクライアントに対応したP層フレームワークはWindows Formsのみのサポートとなります。

**Windows Formsでは[[P層イベント処理機能]]に対応させるコントロール・イベントが多くなり過ぎる。 [#r9385b2a]
[[ベースクラス2]]をカスタマイズする事で[[P層イベント処理機能]]に対応したコントロール・イベントの追加が可能ですが、WindowsFormsでサポートが必要なコントロール イベントが多い場合、カスタマイズ量が多くなるため、.NET標準のイベントハンドラから、隠しボタン(HiddenButton) のDoClickメソッドを呼び出し、Clickイベントを発生させることで、ログ出力や例外ハンドルの対象にできます。また、この方法は、マルチプル・イベントやマルチキャスト・イベントに対応させる方法としても利用可能です(マルチプル・イベントやマルチキャスト・イベントには、.NETの標準イベント側で対応)。
-[[ベースクラス2]]をカスタマイズする事で[[P層イベント処理機能]]に対応したコントロール・イベントの追加が可能ですが、~
WindowsFormsでサポートが必要なコントロール イベントが多い場合、カスタマイズ量が多くなるため、.NET標準のイベントハンドラから、~
隠しボタン(HiddenButton) のDoClickメソッドを呼び出し、Clickイベントを発生させることで、ログ出力や例外ハンドルの対象にできます。

-また、この方法は、[[マルチプル・イベントやマルチキャスト・イベント>https://techinfoofmicrosofttech.osscons.jp/index.php?%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AB%E3%83%BB%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%A8%E3%83%9E%E3%83%AB%E3%83%81%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%83%BB%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88]]に対応させる方法としても利用可能です~
([[マルチプル・イベントやマルチキャスト・イベント>https://techinfoofmicrosofttech.osscons.jp/index.php?%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AB%E3%83%BB%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%A8%E3%83%9E%E3%83%AB%E3%83%81%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%83%BB%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88]]には、.NETの標準イベント側で対応する)。

**Windows FormsのMenuItemコントロールは[[P層イベント処理機能]]でサポートされているか? [#jc36b84e]
サポートされています。コントロールの検索方法が他と異なるため[[ベースクラス2]]をカスタマイズせず 画面のロード処理(UOC_FormInit)でMenuItemのClickイベントに共通Clickイベント ハンドラ(Item_Click)を設定します。なお、同じ要領で、[[ベースクラス2]]をカスタマイズせず、 画面のロード処理(UOC_FormInit)で共通イベント ハンドラ(Item_Click)を直接登録する事で[[P層イベント処理機能]]に対応させる事ができます。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS