中程度の信頼で一時ユーザーファイルをASP.NETに保存する
-
07-07-2019 - |
質問
ASP.NET Webアプリケーションのユーザーがテキスト情報と画像で構成される紹介文を送信するシナリオがあります。送信プロセスには次の手順があります。
- 最初にユーザーがコンテンツを入力し、画像へのパスを選択します
- プレビューをクリックすると、確認できるようにもう一度情報が表示されます
- 情報がデータベースに保持されていることを確認したら
これに関する問題は、ユーザーが実際に確認する前に、アップロードした画像をDBに保存したくないことです。代わりに、一時ファイルとして保存し、最終確認後にのみDBに配置します。
また、アプリケーションを中程度の信頼で実行したいので、アプリケーションディレクトリのみに書き込み権限があり、外部には許可されていません。 ASPNET / NETWORK SERVICEユーザーの書き込み許可を〜/ App_Dataフォルダーに制限したいです。私のシナリオの問題は、このフォルダーに一時ファイルが作成されると、アプリケーションプールがリサイクルされることであり、すべての証言の送信時にそれが望ましくないことです。
これらの一時ファイルを代わりに保存することをどのようにアドバイスしますか?ファイルを更新してもプールは再起動されません-作成時または名前変更時にのみ。しかし、すべてのユーザーが画像全体を単一のファイルに保存できるとは思いません。どう思いますか?
更新:アップロードにサードパーティのコントロールを使用していることに注意してください。アップロード後にファイルコンテンツのバイナリストリームにプログラムでアクセスできますが、2回目のポストバック後はこれを維持できません(最初のステップとポストバックが実際にアップロードを実行します)。
解決
IsolatedStorage をお勧めします。これは一種の仮想フォルダーです。
CodeProjectの例からの抜粋:
IsolatedStorageFileStream stream =
new IsolatedStorageFileStream(ISOLATED_FILE_NAME,
FileMode.Create, isoStore);
StreamWriter writer = new StreamWriter( stream );
writer.WriteLine( "This is my first line in the isolated storage file." );
writer.WriteLine( "This is second line." );
writer.Close();
更新:ファイルをクリーンアップするには、次のようにします。
string fileName = "isolatestorage.txt";
IsolatedStorageFile storage = IsolatedStorageFile.GetStore(
IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
string[] files = storage.GetFileNames(fileName);
foreach(string file in files) {
if(file == fileName) {
storage.DeleteFile(file);
break;
}
}
他のヒント
Microsoftが出荷するデフォルトのweb_mediumtrust.configファイルは、実用的でないことで有名です。
これは、デフォルトのweb_mediumtrust.configファイルからの抜粋です。デフォルトでは、System.IOを使用してtempフォルダーを検出したり、一時フォルダーに書き込んだりすることはできません。
<IPermission
class="FileIOPermission"
version="1"
Read="$AppDir<*>quot;
Write="$AppDir<*>quot;
Append="$AppDir<*>quot;
PathDiscovery="$AppDir<*>quot;
/>
@Sebで述べたように、分離ストレージの使用経験はありませんが、デフォルトの構成ファイルで許可されているようです。
通常の Path.GetTempFilenameを引き続き使用できます。 ()メソッドを使用して、ASP.NETシナリオで一時ファイルを取得します。
NETWORK_SERVICEによって書き込み可能で、アプリケーションフォルダーではなく、実際のWindowsの一時フォルダーのいずれかに存在する一時ファイルパスを提供する必要があります。
ホストが自分のサーバーを正しく構成していれば、問題なく動作するはずです。
これは(charの制限を避けるために)私の質問にコメントしたLeppieへの返信です
...アプリケーションプールは、明確な理由なく不可解にリサイクルされる場合があります。これは通常、構成の問題であるか、アプリケーションディレクトリでファイルシステム操作を実行しているためです。
それはリサイクルすることになっていないのですか?