ASP.NETで一時ファイルを処理する方法は?
-
03-07-2019 - |
質問
コンパイラが生成した" Temporary ASP.NET Files"については話していないことに注意してください。
私のWebアプリケーション(ASP.NET MVC)はGraphvizを使用して画像を生成し、その画像をクライアントに送ります。これには一時ファイルの作成が必要です。
これらに対処する最良の方法は何ですか?それらが送信された直後にそれらを削除する方法はありますか?バックグラウンドスレッドを使用する必要がありますか? Application_StartまたはApplication_Endに何かありますか?
解決
コントローラーを介して行うことも、ASHXを使用することもできません( http://www.marklio.com/marklio/CommentView,guid,df8d6471-83fd-4f66-a799-ef8274979f0e.aspx )を使用してコンテンツをストリーミングし、一時ファイルを1回削除しますストリームの書き込みを終了しましたか?
他のヒント
Graphvizはクライアントを作成し、それらをページ内のリンクとして追加します。 直接削除することはできません。
いくつかの方法があります:
- アプリケーションの起動時には、これらの画像のいずれも使用しないでください。削除できます
- 画像への参照(パスなど)をキャッシュに追加し、画像を削除するCacheItemRemovedCallbackを追加します。 (HD上の画像の量を適切に制限します
- タイマーを作成し、アイテムを定期的に削除します
1秒前に作成された画像は削除しないでください。使用できるためです。
他のユーザーによって記述されたメソッドを使用しますが、画像を再度必要とする場合はブラウザにキャッシュを使用するように設定しますレスポンス内のLast-Modifedヘッダー、次に画像ハンドラー内で If-Modified-Sinceヘッダーでは、ハンドラーはStatusCode 304で応答する必要があります" NOT Modified"そのようにして、クライアントブラウザがキャッシュをクリアしない限り、画像が表示されます。
私は、それらを生成する同じアクションのアクションによって作成された一時ファイルを扱いたいです。例:(MVCで、ただしこれはどのフレームワークにも適用できます)
public ActionResult Foo()
{
FooCleanup(); // deletes files in "~/temp/Foo/" older than a day or so
string filename = CreateTemporaryFile(); // Creates a temporary file like "~/temp/Foo/{timestamp}.foo"
return File(filename);
}
Foo()が頻繁に呼び出される場合、クリーンアップを頻繁に呼び出すだけのロジックを追加できます。これは、貧乏人のcronジョブのようなものですが、うまく機能します。
application_startをタイマーのようなもので使用して、24時間ごとに実行し、1日1回一時ファイルフォルダーをクリーンアップ/削除します。
ハンドラー(.ashx)を作成し、それを介して一時ファイルをストリーミングできます。そうすれば、ファイルがクライアントに転送されたことを知ることができ、ハンドラーの最後で一時ファイルを削除できます。
これで起こりうる問題は、ファイルをすぐに削除するため、クライアントがファイルを2回ダウンロードできないことです。 (ページ出力キャッシュを使用して軽減できます...)
最良の方法は、一時ファイルの問題を全面的に回避できる場合、ハンドラーで生成することにより、要求に応じてファイルをストリーミングすることです...