C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Application変数とインターネットブラウザ

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■82903 / inTopicNo.1)  Application変数とインターネットブラウザ
  
□投稿者/ あさ (31回)-(2017/02/18(Sat) 18:47:18)

分類:[.NET 全般] 

お世話になります。

Windows10、ASP.NET(VB)、.NET Framework4.6、ローカルIISで開発しています。
WebサーバーOSはWindowsServer2012R2です。

Webページの状態管理についてです。

ASP.NETの状態管理には、いくつもの方法があると思います。
https://codezine.jp/article/detail/6622

Session変数、ViewState変数等は、インターネットブラウザを閉じると消えます。
Cookieは使用しません。

Application変数で、ユーザーのアクセス状態を管理しています。
ユーザーAが処理Bに入った場合、Application変数=1にします。
この間、他のユーザーは処理Bに入れません。
ユーザーAが処理Bを終えてApplication変数を解放したら、
別のユーザーが処理Bに入れます。

もし、ユーザーAが処理Bの最中にインターネットブラウザでWebページを閉じてしまった場合、
Application変数は解放されていません。
このため、ユーザーAも、他のユーザーも、処理Bに入れなくなってしまいます。

この問題を避けるために、
インターネットブラウザでWebページを閉じた場合、
Application変数も解放する、ようにしたいと考えています。

ネットで調べましたところ、
この部分を制御するプロパティは、
onbeforeunload属性だと書かれてありましたが、
具体的にどうすればよいのか、
分かりません。

何かよい方法がございましたら、
ヒントだけでも頂けましたら、幸いです。

よろしくお願いします。
引用返信 編集キー/
■82904 / inTopicNo.2)  Re[1]: Application変数とインターネットブラウザ
□投稿者/ 魔界の仮面弁士 (1131回)-(2017/02/18(Sat) 19:57:20)
No82903 (あさ さん) に返信
> Application変数で、ユーザーのアクセス状態を管理しています。
Application変数は、アプリケーションプールの再起動や
Webアプリの更新で消えますが、それは問題ないのでしょうか。

> Cookieは使用しません。
揮発性 Cookie すら使用しない、ということでしょうか?
http://www.atmarkit.co.jp/fdotnet/dotnettips/189aspckless/aspckless.html


> ASP.NETの状態管理には、いくつもの方法があると思います。
下記のような実装もありますね。
http://www.atmarkit.co.jp/fdotnet/dotnettips/122globalobj/globalobj.html
http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp10/entwebapp10_04.html


> この部分を制御するプロパティは、
> onbeforeunload属性だと書かれてありましたが、
onbeforeunload は、JavaScript 側の制御ですので、
今回の目的にはそぐわないと思います。

ブラウザが閉じられなかったとしても、通信エラーなどで
途絶する可能性もありえるわけですから、クライアント側からの
終了通知を期待することはできません。

逆に生存確認であれば、非同期通信を定期的に投げさせることで
判断できるかと思います。生存通知が一定時間来なくなったら、
タイムアウトとみなすということで。
引用返信 編集キー/
■82905 / inTopicNo.3)  Re[1]: Application変数とインターネットブラウザ
□投稿者/ WebSurfer (1145回)-(2017/02/18(Sat) 22:59:56)
No82903 (あさ さん) に返信

2 つ解決できなそうな問題があって質問者さんがやりたいことを実現するのは無理だと思
います。

(1) ユーザーの特定

> ユーザーAが処理Bに入った場合、Application変数=1にします。
> この間、他のユーザーは処理Bに入れません。
> ユーザーAが処理Bを終えてApplication変数を解放したら、
> 別のユーザーが処理Bに入れます。

ということは、ユーザー A 以外は「Application変数を解放」できないということだと理解
していますが、ユーザー A を特定するのをどうするか。

> Session変数、ViewState変数等は、インターネットブラウザを閉じると消えます。
> Cookieは使用しません。

という文から、Session にも ViewState にも Cookie にも頼らないということを言っている
と理解していますが、それでは Windows 認証等でログイン済みのユーザーでもない限り、要
求しているユーザーを特定する方法はないと思います。

特定できなければ「Application変数を解放」はできないのでは?


(2) 作業中止の判定

仮に上記 (1) の問題が質問者さんの言う onbeforeunload イベントで何かする等の方法で対
処できたとして、ユーザー A がブラウザを開いたまま、会議とかで長時間席を外してしまう
とか、作業をほったらかしてしまったらどうなるのでしょう?

基本的にサーバーからはユーザーがまだログインしているか否かとか、ましてや作業中か否か
を知る方法はありません。

なので、根本的に考え直した方がよさそうな気がします。
引用返信 編集キー/
■82906 / inTopicNo.4)  Re[2]: Application変数とインターネットブラウザ
□投稿者/ あさ (32回)-(2017/02/19(Sun) 09:57:44)
No82905 (WebSurfer さん) に返信

ありがとうございます。

> ユーザー A を特定するのをどうするか。
> 特定できなければ「Application変数を解放」はできないのでは?

ユーザーAを特定するために、Sessionは使っています。
Session(ユーザーのID)のようにしています。

ユーザーAがログイン中に設定したApplication変数=1を、
他のユーザーが解除するコードを書くことはできますが、
それでは、排他制御ではなくなってしまいますので、
書いていません。

> 仮に上記 (1) の問題が質問者さんの言う onbeforeunload イベントで何かする等の方法で対
> 処できたとして、ユーザー A がブラウザを開いたまま、会議とかで長時間席を外してしまう
> とか、作業をほったらかしてしまったらどうなるのでしょう?

そうですね。
この問題点については、
考えておりませんでした。

一般的には、何の作業もないまま○○分が経過した場合には、
Sessionを切り捨てる、という方法がありそうですが、
まだ調べておりません。

インターネットでの悲観的排他制御は、
難しいですね。

根本的に考え直してみます。
引用返信 編集キー/
■82907 / inTopicNo.5)  Re[2]: Application変数とインターネットブラウザ
□投稿者/ あさ (33回)-(2017/02/19(Sun) 10:14:46)
No82904 (魔界の仮面弁士 さん) に返信

ありがとうございます。

> Application変数は、アプリケーションプールの再起動や
> Webアプリの更新で消えますが、それは問題ないのでしょうか。


はい。
アプリケーションプールの再起動、Webアプリの更新をする際には、
前もってマイページで、特定の日時にはログイン、処理Bが出来なくなる旨をお知らせして、
行ないます。


> 揮発性 Cookie すら使用しない、ということでしょうか?
セキュリティ重視で、今のところ考えておりませんが、
こうした方法もあるのですね。


> 下記のような実装もありますね。
とても参考になります。


> ブラウザが閉じられなかったとしても、通信エラーなどで
> 途絶する可能性もありえるわけですから、クライアント側からの
> 終了通知を期待することはできません。
そうですね。


> 逆に生存確認であれば、非同期通信を定期的に投げさせることで
> 判断できるかと思います。生存通知が一定時間来なくなったら、
> タイムアウトとみなすということで。


この方法がよさそうですね。
タイムアウトの設定方法について、
調べてみます。
引用返信 編集キー/
■82908 / inTopicNo.6)  Re[3]: Application変数とインターネットブラウザ
□投稿者/ あさ (34回)-(2017/02/19(Sun) 10:25:26)
WebSurfer様、魔界の仮面弁士様、
お忙しい中、お答えを頂きまして、
とても助かりました。

ありがとうございます。

ブラウザにもいくつもの種類があり、パソコンだけではなくスマホやタブレットがあり、
ブラウザを閉じる、だけではなく、急に電源が落ちる場合、つけっぱなしの場合、
等々、想定されますね。

ASP.NETでの排他制御が基本的にはオプティミスティックになっている理由は、
こうしたところにありそうですね。

誰も処理Bが出来なくなってしまった場合、
その連絡を電話などで受けて、
管理側の管理ソフトでApplication変数を解放させる、
ということはシステム上は可能ですが、
24時間管理者が待機している運用を取っていないことから、
この方法は使えません。

また、ASP.NETで開発しているWebページは、パソコン用でして。
スマホアプリも作るように言われているのですが、
スマホアプリはASP.NETではなく他のツールで開発することになりますよね。
データベースは共通です。

こうなりますと、Application変数等の方法で排他制御を行っても、
スマホアプリでは無効になってしまいますね。

根本的に見直すこと、タイムアウトを設けること、
この方向性で取り組んでみます。

ありがとうございます。


解決済み
引用返信 編集キー/
■82909 / inTopicNo.7)  Re[4]: Application変数とインターネットブラウザ
□投稿者/ あさ (35回)-(2017/02/19(Sun) 10:27:03)
>管理側の管理ソフトでApplication変数を解放させる

厳密には、管理用IDでログインして、になります。
解決済み
引用返信 編集キー/
■82910 / inTopicNo.8)  Re[4]: Application変数とインターネットブラウザ
□投稿者/ WebSurfer (1146回)-(2017/02/19(Sun) 12:42:14)
No82908 (あさ さん) に返信

> ASP.NETでの排他制御が基本的にはオプティミスティックになっている理由は、
> こうしたところにありそうですね。

何か勘違いしてませんか?

ASP.NET でページの表示に排他制御をかけるという話は少なくとも自分は聞いたことが
ありません(自分が知らないだけという可能性は否定しきれませんが)。

SQL Server などのデータベースの編集・更新操作における同時実行制御とごっちゃにな
っていませんか?

データベースの編集・更新操作であれば、ASP.NET Web アプリに限らず、ウィザードベー
スで楽観的同時実行制御を一行もコードを書かないで実装できます。

厳密な排他制御を行う場合は、編集状況を記録するためにデータベーススキーマの修正な
どを行う必要がある(質問者さんが気付かれたようにタイムアウトなどを設定する)とい
うことで、ウィザードベースで実装というような簡単な話ではなくなってくるので、自力
で実装せざるを得ないということだと思います。

「Viual Studio 2005 による Web アプリケーション構築技法」という本に、SQL Server
データベースに対して排他業務制御を行うサンプルが書いてありましたが、そのサンプル
ではテーブルに Session ID とタイムアウトを記録するフィールドを追加して排他制御を
行っています。興味があれば読んでみてください。

解決済み
引用返信 編集キー/
■82914 / inTopicNo.9)  Re[5]: Application変数とインターネットブラウザ
□投稿者/ あさ (36回)-(2017/02/19(Sun) 18:31:46)
No82910 (WebSurfer さん) に返信

ありがとうございます。

内容をよく整理してみますね。

著書も確認させて頂きます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ