私の Web アプリケーションは PDF ファイルを生成し、電子メールまたはファックスで顧客に送信します。どういうわけか、IIS6 はファイルを保持し、古い「..別のプロセスで使用されているため、プロセスがファイル 'xxx.pdf' にアクセスできない」と主張して、ファイルに対する他の要求をブロックしています。
アプリケーションプールをリサイクルすると、すべて問題ありません。なぜこれが起こっているのか、どうすればそれを止めることができるのか誰にも分かりません。
ありがとう
誰もが言ったように、PDF ファイルを読み書きするときに開いているすべての IO オブジェクトでClose
andメソッドを呼び出してください。Dispose
しかし、サードパーティのコンポーネントを組み込んだと思いますか? あなたのためにPDFの書き込みを行うには?その場合は、ベンダーやそのドキュメントを確認して、ベンダーが意図したとおりに作業を行っていることを確認してください。それ自体が証明されていない限り、他の誰かから入手したブラックボックスを信頼しないでください.
別の場所として、PDF ファイルへの複数の Web 要求中に何が起こるかを確認してください。ファイルが複数の場所から同時に書き込まれていないことを確認してください。たとえば、同時に PDF を生成する 2 ~ 3 のリクエスト?またはPDF生成プロセスに沿って2〜3ページですか?
最後に、例外ログをチェックして、気付かないうちにクラッシュ/スレッドの終了やファイルハンドルを開いたままにしていないことを確認することをお勧めします。複数のスレッドのシナリオでよく発生します。スレッドがクラッシュして終了することもあります。これは、特にサードパーティのコンポーネントを使用している場合に発生する可能性があります。
ファイルが作成された後も、ワーカー プロセスによってロックされているようです。ファイルのすべての接続を閉じていることを確認してください。(using ブロックを使用すると処理されることを覚えておいてください)
コードを調べて、(生成された) ファイルを開くためのすべてのハンドルが適切に閉じられていることを確認します。場合によっては、ガベージ コレクターに頼ってこれらを整理することはできません。
ディスク上のファイルを書き込むすべてのコードが、finally 句または C# の「using」句で適切な .Close() を使用して、すべてのハンドルを適切に閉じることを確認します。
byte[] asciiBytes = getPdf(...);
try{
BinaryWriter bw = new BinaryWriter(File.Create(filename));
bw.Write(pdfBytes);
}
finally {
if(null != bw)
bw.Close();
}
Response 句と Content-Disposition 句を使用してファイルを送信します
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-disposition", "attachment; filename=" + PDID + ".pdf");
Response.WriteFile(filename);
Response.Flush();
示されているコードは、約 18 か月から Pdf ファイルを作成して顧客に送信しますが、ファイルがロックされたことは一度もありません。
前に述べたように: 開いているすべてのハンドラーを閉じるように注意してください。
Microsoft のインデックス サービスがファイルをブロックすることがあります。ディレクトリを除外する