Domanda

La mia applicazione web genera file PDF e li invia tramite e-mail o fax ai nostri clienti.In qualche modo IIS6 trattiene il file e blocca qualsiasi altra richiesta sostenendo il vecchio "...il processo non può accedere al file" xxx.pdf "perché è utilizzato da un altro processo".

Quando riciclo il pool di applicazioni, tutto va bene.Qualcuno sa perché questo sta accadendo e come posso fermarlo.

Grazie

È stato utile?

Soluzione

Come hanno detto tutti, chiama il Close E Dispose su qualsiasi oggetto IO aperto durante la lettura/scrittura dei file PDF.

Ma suppongo che tu abbia incorporato a Componente di terze parti? scrivere il PDF per te?In tal caso, potresti voler verificare con il fornitore e/o la sua documentazione per assicurarti di fare le cose nel modo in cui i fornitori le intendevano.Non fidarti della scatola nera che hai ricevuto da qualcun altro a meno che non abbia dato prova di sé.

Un altro posto in cui cercare potrebbe essere ciò che accade durante più richieste Web ai file PDF, sei sicuro che il file non venga scritto contemporaneamente da più posizioni?per esempio.2-3 richieste che generano PDF contemporaneamente?o 2-3 pagine durante il processo di generazione del PDF?

E infine, potresti voler controllare i log delle eccezioni per assicurarti che nulla si blocchi o il thread esca e lasci aperto l'handle del file senza che tu te ne accorga.Succede spesso in scenari di threading multipli, a volte il thread si arresta in modo anomalo e si chiude, il che potrebbe accadere soprattutto se si utilizzano componenti di terze parti, che potrebbero eseguire alcuni Magia trucchi, non lo sapresti mai.

Altri suggerimenti

Sembra che i file, dopo essere stati creati, siano ancora bloccati dal processo di lavoro.Assicurati di chiudere tutte le connessioni per il tuo file.(ricorda, l'uso dei blocchi si occuperà di questo)

Esaminerei il tuo codice e mi assicurerei che tutti gli handle per aprire i file (generati) siano stati chiusi correttamente.A volte non puoi fare affidamento sul garbage collector per risolvere queste cose.

  1. Come accennato prima:Fare attenzione a chiudere tutti i gestori aperti.

  2. A volte il servizio di indicizzazione di Microsoft blocca i file.Escludi la tua directory

Controlla che tutti i file di scrittura del codice su disco chiudano correttamente ogni handle utilizzando l'apposito .Close() nella clausola final o tramite la clausola "using" di C#

byte[] asciiBytes = getPdf(...);
try{
BinaryWriter bw = new BinaryWriter(File.Create(filename));
bw.Write(pdfBytes);
}
finally {
  if(null != bw)
    bw.Close();
}

Utilizzare la clausola Response e Content-Disposition per inviare il file

Response.ContentType = "application/pdf";
Response.AppendHeader("Content-disposition", "attachment; filename=" + PDID + ".pdf");
Response.WriteFile(filename);
Response.Flush();

Il codice mostrato crea e invia file Pdf al cliente da circa 18 mesi e non abbiamo mai visto un file bloccato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top