2011-01-04 8 views
0

ウェブカメラの現在のイメージを表す.jpgファイルがあります。ユーザーはこのファイルを1秒間隔でダウンロードします。何十人ものユーザーがそれを読んでいる可能性があるので、これは1秒に数十回(これはどのWebサーバーでも正常です)です。イメージファイルの同時読み書き(asp.net、ほとんどのウェブ言語に適用)

問題は、この画像は、私のローカルネットワークのウェブカメラのポータル画像を「スパイダー」する第三者アプリケーションによっても1秒ごとに更新されます。これは私たちが現在の管理パネルにウェブカメラを構築できるようにするためです。

私が既に知っている問題は、ASP.netがボットの書き込み権限がオープンしているため、ファイルにアクセスできないというエラーが発生することがあることです。同様に、IISはユーザーにそれを供給しているため、ボットはアクセスできません。

ボットはio.streamwriterを使用してデータをファイルに保存し、スクリプトはResponse.WriteFileを使用してファイルをスクリプトに送信します。 (私は実際のASP.netページを使用して、アクティブなセッションを持つユーザーだけがJPGを見ることができるようにファイルを供給するJPGコンテンツタイプを使用する必要があります)。

私の質問はこのためのベストプラクティスです。私はなぜそれが起こっているのか知っていますが、これのために最善の解決策は何ですか?すでにデータベースが並行読み込み/書き込み用に作成されているため、データベース内のBLOBとして格納するほうが賢明かもしれませんか?私がまだ考えていないファイルでこれを行う簡単な方法はありますか?事前に

おかげで、

アンソニー・グレコ

答えて

1

読者がSNAPSHOT分離モデル(SQL Server 2005以降)を使用する場合は、BLOBの使用が有効です。 BLOBからイメージをストリーミングする方法についてはDownload and Upload images from SQL Server via ASP.Net MVCを参照し、SNAPSHOTについてはUnderstanding Row Versioning-Based Isolation Levelsを参照してください。

しかし、BLOBを使用すると、余計になることがあります。たとえば、ASP.Netプロセスが1つしかない場合は、現在のファイル名に対してグローバル変数volatileを設定できます。作者はJPGをの新しいファイルに書き込み、次にグローバルな「現在の」ファイル名をInterlocked.CompareExchangeの操作で更新します(これは比較する必要があります。なぜなら、より新しいライターが実際に速くなり、以前のライターを抜いてしまいます。最新の更新を保持する)。解決すべきいくつかの問題がまだ残っています(起動時にファイル名を調べ、古いファイルをクリーンアップするなど)。しかし、それらはすべてかなり簡単に解決できます。

サイトのサーバーファームまたは複数のASP.Netプロセスがある場合は、状況が複雑になる可能性があります。私はまだ回転ファイル名を実行し、試行錯誤のアプローチを行います(最新のファイルで応答し、競合が検出された場合は以前の古いファイルに戻してください)。

+0

ありがとう。これをテストするまでには時間がかかるでしょうが、両方の回答が私が現在やっていることよりも良い選択肢のようです。私は、2つのファイルを実際に効率的に使用していたかどうかは確かではありませんでしたが、それが私の最善の選択肢でもあるのならば。ありがとうございました –

1

あなたは別のファイル名にデータを書き込むためのボットを取得し、その後、削除を行うと、ASP.Netによって提供されているファイル名に名前を変更することができます。これにより、ファイルのロック時間が、削除および名前変更の発生までに短縮されます。明確にする:

  1. ボットは、「temp.jpg」
  2. 最後の画像のバイトが書き込ま
  3. は、ボットが削除され、「webcam.jpg」とに画像データを書き込む「webcam.jpg」から画像を提供ASP.Net 「webcam.jpg」を「temp.jpgを」名前を変更
ASP.Netを確認する必要があり

は10ms(または適切な小さな増分を)待ってから再度確認していない場合は、「webcam.jpg」は、存在しています。

+0

これは私が推測する時間を最小限に抑えますが、100秒のリクエストを1秒間取得すると、まったく同じように問題が発生することがあります。私はそれを試してみましょう –

関連する問題