- PR -

ASP.NETでの閲覧者情報

投稿者投稿内容
蓮華
常連さん
会議室デビュー日: 2004/11/06
投稿数: 25
投稿日時: 2005-07-15 08:23
掲題の件ですが、ASP.NETにて今現在どのページに何人の人間が閲覧しているのかを
管理者などが専用のWeb画面にて見たいというニーズが出てきました。

また、資料やサンプルなどWeb上にてダウンロード可能なファイルについて、
正確なダウンロード数をカウントしたい、そして同時にダウンロード出来る数を
負荷分散のために制限したいというニーズもあります。

ダウンロード数はリンクをクリックした時点でカウントすると、
ダウロード途中にキャンセルなどを押して取り止めた場合、
正確ではないので駄目という事です。
ダウンロード制限に関しては、最初に書きました閲覧者情報の仕組みが出来れば、
それを改良すれば出来るのではないかと考えています。

こういった事をやりたい場合、どのようにすれば実現可能なのか
ご教授頂ければ幸いです。
MERCY
会議室デビュー日: 2005/07/12
投稿数: 18
投稿日時: 2005-07-15 10:02
あの〜、Webのどのページを開いてるかなんて分からないです
というより、二つともASP.NETでやるべきことではないかと・・・・・

何人が見てるかはWebサーバのログで
同時ダウンロードの制限はFTPサーバでやればどうですか?
でFTPサーバのログでダウンロード数も正確にわかりますけど・・・

まぁ、これ以上と言うことなら、何を持ってWebを見てると判定するのか
判定するに当たって例えば、フレームを切って1秒リロードをかけ続けて
見てるかどうかを常に判定するみたいな方法を使うほど知りたいのか

とかもう少し、どんなユーザーが使うのか
どんな精度でどの程度知りたいのかが分からないと何とも・・・・
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-07-15 11:37
ASP.NETでなくJavaでの実装方法となりますが、ご参考までに。

まずページごとの閲覧情報ですが、
クライアントへのResponseとして最後に返したページ情報を
SessionIDと紐付けて管理します。この情報をDBなりオブジェクト
なりに格納して参照すればOKです。この際、RequestURLと結び
つけてしまうと動的なページ構成に対応出来ないので注意してく
ださい。
ここでクライアントがブラウザを閉じたり、他のサイトへ遷移して
しまった場合にどうするかという問題点があがってきますが、
セッション情報の変更を通知する仕組みを利用してセッションがタ
イムアウトとなった際にページ閲覧カウントを-1とするなどの対応
を組み込むことが出来ます。
セッションタイムアウトまでの間は閲覧カウントに誤差が発生して
しまいますが、この誤差を埋めることは不可能でしょう。

次にダウンロードのキャンセル対応ですが、
Java/Servlet/Tomcat/IEの環境においてダウンロードダイアログか
らキャンセルボタンを押下した場合は、ソケット書き込み例外が
発生しますので例外のあるなしで保存されたか否かを判断すること
が可能です。
ASP.NETでも同様の例外を拾うことが可能であるならば、実装は容易
であるかと思います。ただし、この動作がブラウザなどに依存する
可能性があるかもしれませんので、テストは入念に行う必要がある
でしょう。
蓮華
常連さん
会議室デビュー日: 2004/11/06
投稿数: 25
投稿日時: 2005-07-21 09:54
返答が遅くなりました。

まず、ページ毎の閲覧情報ですが、確かに誤差が発生しますね。
しかし、これは仕様ということで片付けます。

ダウンロード数のカウントの件なのですが、これはユーザが"どうしても"という
機能なので何とかしなくてはいけません。
なぜユーザが拘っているかというと、WindowsUpdateではユーザが選択した
更新モジュールを途中でキャンセルしたり正常にダウンロードし
インストール終了したりするとWeb画面が変わります。
つまり、ダウンロードが全部終わったかどうかの判定が出来ているという事になります。
この事からも"無理です"とは言えない状況にあります。

またダウンロード数制限ですが、この制限というのは全体のダウンロード数の
制限ではありません。
1人が同時にダウンロードできる制限です。
つまり、極論を言えば最大で1万人の同時ダウンロードは認めるが
同一人物(ホストやIPで判定)が同時に2つ以上のファイルをダウンロードするのは
認めないということです。
ユーザにレジューム機能のあるソフトで同時に落とすなといっても、
使う人間は使ってしまうので、この部分を制御したいのです。
レジューム機能のソフトを使っても1つずつ落とす事は認めます。

この機能についても、ユーザがプライベートで使用しているCGI(Perl)の
レンタルサービスにおいて俗に言われるアップローダーにそういった機能が
付いているそうです。(確認してみました)
私の想像ですが、恐らくそのレンタルサービスが動作しているサーバでの
ネットワーク状況か何かをPerlのCGIが調べて判断してるのだと思っています。

ASP.NETでやるべき事では無いとの意見もありますが、
特にASP.NET"だけ"で実現させるつもりは最初からありません。
問題はWindowsの機能やサービスなどからの情報を
どうやってASP.NETで使うのかだと思っています。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-07-21 10:19
引用:

DAIさんの書き込み (2005-07-21 09:54) より:
返答が遅くなりました。
なぜユーザが拘っているかというと、WindowsUpdateではユーザが選択した
更新モジュールを途中でキャンセルしたり正常にダウンロードし
インストール終了したりするとWeb画面が変わります。
つまり、ダウンロードが全部終わったかどうかの判定が出来ているという事になります。
この事からも"無理です"とは言えない状況にあります。


でも、あれってWEBブラウザでダウンロードしているわけじゃないですよね?
ActiveXコントロール使ってもよいなら、同じことも出来るでしょうけど。

引用:

またダウンロード数制限ですが、この制限というのは全体のダウンロード数の
制限ではありません。
1人が同時にダウンロードできる制限です。
つまり、極論を言えば最大で1万人の同時ダウンロードは認めるが
同一人物(ホストやIPで判定)が同時に2つ以上のファイルをダウンロードするのは
認めないということです。
ユーザにレジューム機能のあるソフトで同時に落とすなといっても、
使う人間は使ってしまうので、この部分を制御したいのです。
レジューム機能のソフトを使っても1つずつ落とす事は認めます。


それを実現するためにはユーザー認証とセッション管理の両方が必要ですよね。
ユーザーがログインしたときに、既にログインされている場合は、既存のセッションを強制的に終了するか、あるいはログインを失敗させればよいですよね。

引用:

ASP.NETでやるべき事では無いとの意見もありますが、
特にASP.NET"だけ"で実現させるつもりは最初からありません。
問題はWindowsの機能やサービスなどからの情報を
どうやってASP.NETで使うのかだと思っています。


ASP.NET云々は関係なくて、WEBベースのシステムの理解に関する問題かと思います。
蓮華
常連さん
会議室デビュー日: 2004/11/06
投稿数: 25
投稿日時: 2005-07-21 10:41
引用:

それを実現するためにはユーザー認証とセッション管理の両方が必要ですよね。
ユーザーがログインしたときに、既にログインされている場合は、既存のセッションを強制的に終了するか、あるいはログインを失敗させればよいですよね。



ログイン機能は管理画面以外は実装の予定はありません。
誰が見ても(外部の人間でも)良いものなので、
いちいちログインする手間も実装する時間・金も管理も無駄というのが
ユーザの意向です。

理想的なものは、OSの機能なりコマンドなりサービスなりで
ネットワークの接続状況とアクセスしているファイル名が分かればと考えています。

最初はNETSTATコマンドが使えるかな?と思ったのですが
NETSTATコマンドでは接続状況は分かりますが、
アクセスしているファイル名までは分かりません。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-07-21 10:55
どもです。がると申します。

引用:

ダウンロード数のカウントの件なのですが、これはユーザが"どうしても"という
機能なので何とかしなくてはいけません。
なぜユーザが拘っているかというと、WindowsUpdateではユーザが選択した
更新モジュールを途中でキャンセルしたり正常にダウンロードし
インストール終了したりするとWeb画面が変わります。
つまり、ダウンロードが全部終わったかどうかの判定が出来ているという事になります。
この事からも"無理です"とは言えない状況にあります。


んっと。HTTPの仕様をきちんと見るとわかるはずなのですが。
原則としては「無理」です。
端的に書くと、CGI(広義でのCGI。ASPとかJSPとか含む)は飽く迄
「サーバ側の挙動」で、ダウンロードが途中でどうなったかを
知ることが出来るのは「クライアント側の挙動」です。
「投げっぱなし型プロトコル」であるHTTPでクライアントの挙動の
把握というのは、原理的には無理です。

WindowsUpdateで把握できるのは「IEを使うことを強制して」「JavaScriptを
onにして」クライアント情報を気合で取り込んでいるから可能なだけです。

社内Webであればまだしも、ではあるのですが。一般に閲覧させる
ようなPageで上記の条件を「必ず満たす」Pageは…まぁ止めはしませんが、
あまり好ましいブツじゃないように思われます。

引用:

またダウンロード数制限ですが、この制限というのは全体のダウンロード数の
制限ではありません。
1人が同時にダウンロードできる制限です。
つまり、極論を言えば最大で1万人の同時ダウンロードは認めるが
同一人物(ホストやIPで判定)が同時に2つ以上のファイルをダウンロードするのは
認めないということです。


微妙ですねぇ。機能云々の前に「ダウンロードが途中で止まってしまって」
という状況から「間違えてファイルを消してしまったからもう一度」
まで、さまざまな状況で「再ダウンロード」への要求ってあるので。
そのあたりはちゃんと考察しないと、運用開始後に地獄が見れます。

ちなみに、機能自体は、認証後であることを前提に、さほど難しく
なく実装は可能です。
が、
引用:

ログイン機能は管理画面以外は実装の予定はありません。
誰が見ても(外部の人間でも)良いものなので、
いちいちログインする手間も実装する時間・金も管理も無駄というのが
ユーザの意向です。


という話の場合「無理」です。
Cookieで云々という話もあるのですが、確実ではなくて。
「いくらでも偽装できるから制限がないも同然」程度の制御しか
できないです。

引用:

ASP.NETでやるべき事では無いとの意見もありますが、
特にASP.NET"だけ"で実現させるつもりは最初からありません。
問題はWindowsの機能やサービスなどからの情報を
どうやってASP.NETで使うのかだと思っています。


んっと。「Windowsの機能を使う」事自体が「HTTP上でやるべき事
ではない」のですが :-P
ASP.NETの前に、ASP.NETがのっかっている土台の「HTTP」を
きちんと掌握したほうがよいと思うです。

ちっと厳しい発言が連打してしまいましたが。
HTTPの特性をきちんと把握した上で、一度お客様と要件を
つめなおしたほうが無難だと思います。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-07-21 11:10
言葉が足りなかったかな。

あなたはIPアドレスで同一人物か判断しようと考えているようですが、それは無理ですよね。現状では、NATやProxyを使って同一IPアドレスを複数人で共有するのが普通です。もしIPアドレスで判断すれば、ファイルをダウンロードできないというトラブルが頻発するでしょう。

SessionIDで同一人物の複数ダウンロードを区別するのも困難です。WEBブラウザを二つ立ち上げた場合、それぞれのWEBブラウザは異なるSessionIDを持つ事になるので、簡単に回避できてしまいます。

厳密に一人の人物が複数のファイルをダウンロードできないという機能を実現しようとするならば、個人を識別するためのIDを発行する必要があります。つまりユーザーIDが必要になります。(一人の人間が複数のユーザーアカウントを取得してしまうのはおいて置くとして・・・ )

ダウンロードできない状況が発生するのを承知の上でIPアドレスで判断するのか、回避できるのを承知の上でSessionIDを用いるのか、面倒でもユーザーIDを発行するのか、三択を求められているのだと思うんですけどね。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/

スキルアップ/キャリアアップ(JOB@IT)