- PR -

ASP.NETでの閲覧者情報

投稿者投稿内容
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 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/
蓮華
常連さん
会議室デビュー日: 2004/11/06
投稿数: 25
投稿日時: 2005-07-23 10:56
Jitta氏へ
まず、色々とアドバイスをしていただける方が優秀だと言うことは分かっております。

引用:
 先にも申し上げたとおり、私どもは少々お節介が過ぎるようです。あなたが「解決させている」とする“根拠”を明確にご呈示願えませんか。私どもは、その“根拠”が、セキュリティ的に問題があると思っております。お節介と思われるでしょうが、セキュリティ的に問題がないか、検証させてください。
 できる、できないには、段階があると思います。「1:まったく不可能」→「2:できないことはないが、穴だらけ」→「3:穴もなくできる」という段階です。



まず1つ理解していただきたいのは、今回の場合、ショッピングサイトなどのように
セキュリティ上の問題でユーザに被害が出ることは無いのです。
あくまで目的は"サーバの負荷"を減らす事にあります。

HTTPの特性上無理などという事は、何度も書きますが理解しております。
また、セキュリティ上、穴があったとしても、上記のように甚大な被害が出る事も無いです。
このシステムにおける一番の被害は、サーバに負荷が掛かる事により
サービスが停止する事です。
セキュリティー的には、サーバのデータが改竄されなければ良いという程度のものです。

また、実装したい機能が100%の精度で実装できるとも思っていません。
色々なものを組み合わせたりして、まず実装できるのかどうか、
そして、実装できるのなら、どうすれば100%に近い精度に実装できるのか。

返答のなかでも、ProxyやNATなどでIPが同じになったら厳密に同一人物と判断できないと
書かれた方もいますが、これも十分に理解しており、理解した上でユーザとも検討を行い
1つの制限事項として明記するというしています。
また、これにより他の人がダウンロード出来なくなるという事も無いのです。
少し時間を置いて待てばいいだけです。

再度、言わせていただきますが、今回のこのシステムでの目標は
ユーザの複数ダウンロードによる"サーバ負荷軽減"が最大目標であり、
セキュリティ的にはサーバのデータが改竄されない程度であれば問題無いのです。
蓮華
常連さん
会議室デビュー日: 2004/11/06
投稿数: 25
投稿日時: 2005-07-23 11:17
甕星氏

引用:
ダウンロード数を正確に把握するには・・・
・ユーザーがページを表示するたびに異なるダウンロードURLを乱数で生成する。
http://www.example.com/download.aspx?id=xxxxxxって感じ。
・ダウンロードURLは一度使うと成功/失敗関係なく無効になる。
・ダウンロード正常完了を持ってダウンロード数をインクリメントする。
・その他、雑多なページの参照数についてはログの解析で誤魔化す。



ですから、今問題なのは『ダウンロードが正常に完了した』という情報をどう取得するか?
なのです。
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-07-23 11:50
こんにちは。

引用:

ですから、今問題なのは『ダウンロードが正常に完了した』という情報をどう取得するか?
なのです。



引用:

Java/Servlet/Tomcat/IEの環境においてダウンロードダイアログか
らキャンセルボタンを押下した場合は、ソケット書き込み例外が
発生しますので例外のあるなしで保存されたか否かを判断すること
が可能です。
ASP.NETでも同様の例外を拾うことが可能であるならば、実装は容易
であるかと思います。ただし、この動作がブラウザなどに依存する
可能性があるかもしれませんので、テストは入念に行う必要がある
でしょう。



これって試してみました?
ダウンロード途中にキャンセルボタンが押下された、またはブラウ
ザが閉じられた場合などにレスポンスの書き込みが完了しなかった
ことをServer側で検知することは、100%の信頼度とはいかないです
がある程度のレベルまでならば可能であると思いますよ。
蓮華
常連さん
会議室デビュー日: 2004/11/06
投稿数: 25
投稿日時: 2005-07-23 12:04
masa氏

いえ、試していません。
正確には意味不明です。

というのは、例外が発生したとしてどうやってその情報を受け取るのでしょう?
<a href="○○○.zip">○○○</a>
というHTMLの羅列になります。(JavaだろうとASP.NETだろうと)

これをクリックしてダウンロードのダイアログが出てきて、
キャンセルすると例外が発生。
その例外はどうやって受け取る?
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-07-23 12:15
引用:

DAIさんの書き込み (2005-07-23 12:04) より:
masa氏

いえ、試していません。
正確には意味不明です。

というのは、例外が発生したとしてどうやってその情報を受け取るのでしょう?
<a href="○○○.zip">○○○</a>
というHTMLの羅列になります。(JavaだろうとASP.NETだろうと)

これをクリックしてダウンロードのダイアログが出てきて、
キャンセルすると例外が発生。
その例外はどうやって受け取る?



ああ、それじゃ受け取れる訳ないですね。
<a href="download.asp?id=123">
みたいなHTMLを生成してレスポンスにダウンロードデータを
書き込んであげるという意味ですよ。
蓮華
常連さん
会議室デビュー日: 2004/11/06
投稿数: 25
投稿日時: 2005-07-23 13:34
試してみました。

<a href="hoge.aspx?id=123>DL</a>
などとし、hoge.aspxの中でContentTypeやContent-Dispositionを設定。
ダウンロードするファイルをidから判別し、
該当ファイルを読み込み、そのデータをResponse.OutputStreamに書き込む。

手順はこういう事ですよね?

結果、ダウンロード途中でキャンセルなどした場合など、
特に例外などが発生することは無く、例外をキャッチする事は出来ませんでした。
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-07-23 13:50
こんにちは。

引用:

DAIさんの書き込み (2005-07-23 13:34) より:
試してみました。

<a href="hoge.aspx?id=123>DL</a>
などとし、hoge.aspxの中でContentTypeやContent-Dispositionを設定。
ダウンロードするファイルをidから判別し、
該当ファイルを読み込み、そのデータをResponse.OutputStreamに書き込む。

手順はこういう事ですよね?

結果、ダウンロード途中でキャンセルなどした場合など、
特に例外などが発生することは無く、例外をキャッチする事は出来ませんでした。




そうです、そうです。
接続中のTCP/IPソケットがクライアントから一方的に切断された場合に、
Server側がどのような振る舞いを行うか。という実装上の問題だと思う
のですが、ASP.NETでは無視する実装になっているということですね。
ある程度はうまく行く気がしていたので残念です

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