- - PR -
ASP.NETでの閲覧者情報
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-07-23 09:11
ソースコード具体的に教えてくださいってのは、よほどピンポイントで質問しないと無理ですよ。実装方法を調べるのに必要なキーワードは既に出揃っていると思うので、ご自身でちょいとチャレンジした後にあらためて質問した方がよいと思います。
昨日、出張の道すがら、自分なだどのように実現するか考えてみました。 ダウンロード数を正確に把握するには・・・ ・ユーザーがページを表示するたびに異なるダウンロードURLを乱数で生成する。 http://www.example.com/download.aspx?id=xxxxxxって感じ。 ・ダウンロードURLは一度使うと成功/失敗関係なく無効になる。 ・ダウンロード正常完了を持ってダウンロード数をインクリメントする。 ・その他、雑多なページの参照数についてはログの解析で誤魔化す。 URLを乱数で生成するのが味噌です。これでProxyによるキャッシュ等の影響を受けることなく、ダウンロードされた数を正確に把握できます。あとでログを解析しやすくするために、ファイル名等をURLに含めても良いかも・・・。 1ユーザーが一度にダウンロードできるファイルを一つに限定したいと言うのは、たぶんダウンロードツールによるマルチセッションによる過負荷を防ぐためですよね?毎回提供されるURLが異なるので、既存のマルチセッションダウンロードツールは約に立たなくなるはずです。レジューム機能も無効に出来ます。 一人のユーザーが2つ以上のファイルを同時にダウンロードできないようにする・・・ってのはやっぱり難しいです。単純に過負荷になるのを嫌ってと言うことなら、やっぱりmod_limitipconn相当のものを作って、同時接続数を数十に制限するのが良いと思います。同時接続数を1に制限するのは、どう考えても利用者に優しくないので、数十(運用状況をみて微調整)になるでしょう。 文字通り2つ以上の接続を作ることを禁止したいなら、やっぱり専用のダウンロードツールをActiveXか何かで提供するのが一番良いんじゃないかなぁ。ダウンロード数の把握の問題も一挙に解決できるし。 _________________ 甕星 <mikahosi@abox9.so-net.ne.jp> http://blogs.msmvp.jp/mikahosi/ | ||||||||
|
投稿日時: 2005-07-23 10:56
Jitta氏へ
まず、色々とアドバイスをしていただける方が優秀だと言うことは分かっております。
まず1つ理解していただきたいのは、今回の場合、ショッピングサイトなどのように セキュリティ上の問題でユーザに被害が出ることは無いのです。 あくまで目的は"サーバの負荷"を減らす事にあります。 HTTPの特性上無理などという事は、何度も書きますが理解しております。 また、セキュリティ上、穴があったとしても、上記のように甚大な被害が出る事も無いです。 このシステムにおける一番の被害は、サーバに負荷が掛かる事により サービスが停止する事です。 セキュリティー的には、サーバのデータが改竄されなければ良いという程度のものです。 また、実装したい機能が100%の精度で実装できるとも思っていません。 色々なものを組み合わせたりして、まず実装できるのかどうか、 そして、実装できるのなら、どうすれば100%に近い精度に実装できるのか。 返答のなかでも、ProxyやNATなどでIPが同じになったら厳密に同一人物と判断できないと 書かれた方もいますが、これも十分に理解しており、理解した上でユーザとも検討を行い 1つの制限事項として明記するというしています。 また、これにより他の人がダウンロード出来なくなるという事も無いのです。 少し時間を置いて待てばいいだけです。 再度、言わせていただきますが、今回のこのシステムでの目標は ユーザの複数ダウンロードによる"サーバ負荷軽減"が最大目標であり、 セキュリティ的にはサーバのデータが改竄されない程度であれば問題無いのです。 | ||||||||
|
投稿日時: 2005-07-23 11:17
甕星氏
ですから、今問題なのは『ダウンロードが正常に完了した』という情報をどう取得するか? なのです。 | ||||||||
|
投稿日時: 2005-07-23 11:50
こんにちは。
これって試してみました? ダウンロード途中にキャンセルボタンが押下された、またはブラウ ザが閉じられた場合などにレスポンスの書き込みが完了しなかった ことをServer側で検知することは、100%の信頼度とはいかないです がある程度のレベルまでならば可能であると思いますよ。 | ||||||||
|
投稿日時: 2005-07-23 12:04
masa氏
いえ、試していません。 正確には意味不明です。 というのは、例外が発生したとしてどうやってその情報を受け取るのでしょう? <a href="○○○.zip">○○○</a> というHTMLの羅列になります。(JavaだろうとASP.NETだろうと) これをクリックしてダウンロードのダイアログが出てきて、 キャンセルすると例外が発生。 その例外はどうやって受け取る? | ||||||||
|
投稿日時: 2005-07-23 12:15
ああ、それじゃ受け取れる訳ないですね。 <a href="download.asp?id=123"> みたいなHTMLを生成してレスポンスにダウンロードデータを 書き込んであげるという意味ですよ。 | ||||||||
|
投稿日時: 2005-07-23 13:34
試してみました。
<a href="hoge.aspx?id=123>DL</a> などとし、hoge.aspxの中でContentTypeやContent-Dispositionを設定。 ダウンロードするファイルをidから判別し、 該当ファイルを読み込み、そのデータをResponse.OutputStreamに書き込む。 手順はこういう事ですよね? 結果、ダウンロード途中でキャンセルなどした場合など、 特に例外などが発生することは無く、例外をキャッチする事は出来ませんでした。 | ||||||||
|
投稿日時: 2005-07-23 13:50
こんにちは。
そうです、そうです。 接続中のTCP/IPソケットがクライアントから一方的に切断された場合に、 Server側がどのような振る舞いを行うか。という実装上の問題だと思う のですが、ASP.NETでは無視する実装になっているということですね。 ある程度はうまく行く気がしていたので残念です ![]() |