0

ASP.NET アプリケーションを作成しています。IIS が通常の Web フォルダーとして使用するフォルダーが必要ですが、ファイルが見つからないというエラーが発生した場合に特別なハンドラーが必要です。

(「http://example.com/Magic/」は「C:\example.com\Magic」にマップされます。)

クライアントはhttp://example.com/Magic/1.jpgを要求しますが、 c:\example.com\1.jpg がありません。404 で応答する代わりに、ASP C# が呼び出され、それ自体が 1.jpg をビルドして適切な場所に書き込みます。IIS は再度検索して 1.jpg を見つけ、常にそこにあるかのようにクライアントに返します。

その後、別のクライアントもhttp://example.com/Magic/1.jpgを要求します。IIS は期待する場所でファイルを見つけるため、IIS が静的ファイルを提供するときに許可するすべてのキャッシュとバイト範囲の要求と共に、そのファイルをクライアントに返します。

さらに後で、別のクライアントがhttp://example.com/Magic/2.jpgをリクエストします。2.jpg を作成するために前と同じコードが呼び出されますが、コードはそのようなファイルがないと判断したため、IIS は 404 エラーを返します。

いくつかのメモ...

ASPX が毎回ファイルを提供するのではなく、このようにすることのポイントは、IIS が ASPX ページよりもはるかに優れた静的ファイルを提供することです。IIS は if-modified-since および byte-range リクエストをサポートしているため、ASP.NET モジュールをロードする必要はありません。

管理者として、このジャスト イン タイムのファイル作成機能を使用すると、「Magic」フォルダをときどきクリアすることができ、再度必要であることが判明したファイルは、最初に要求されたときに再作成されます。

2 つのクライアントが同時に同じ URL を要求した場合、ファイル作成コードの 2 つのコピーが同じファイルに対して呼び出されると思います。この可能性を期待するには、これを堅牢に記述する必要があります。

なぜ私がそのようなことをしたいのかコメントで答える:

ファイルが大きく、ディスク容量が不足していることを除けば、「1.jpg」がファイル サーバーに既に存在することを確認することは素晴らしいことです。クライアントがそれらを使用したら、それらのファイルを削除したいのですが、クライアントが「これでこれで完了です」と言う合図はありません。ファイルを途中で削除した場合、クライアントが再度要求したときに、404 を生成せずにファイルを再作成したいと考えています。

ASP.NET を使用して要求ごとにファイルを生成することは表面的には機能しますが、ASP.NET は静的ファイルの提供にはあまり適していません。クライアントは、キャッシュ ヘッダーと要求するバイト範囲を広範囲に使用します。IIS が既に処理を行っている場合、その処理をすべて再実装する必要があります。

カスタム エラー ページ... カスタム コードが実行された後、IIS にもう一度検索して、探していたファイルを見つけ、エラーがないかのように続行するように指示できますか?

4

0 に答える 0