2011-10-12 45 views
17

Ho un sito Web in un ambiente di hosting condiviso IIS 7. È in esecuzione .NET 3.5. Ho un pulsante per scaricare un file dal server.L'handle non è valido. (Eccezione da HRESULT: 0x80070006 (E_HANDLE))

Quando distribuisco localmente questa applicazione su IIS 6, funziona correttamente. Sul server di hosting condiviso di IIS 7, si verifica l'eccezione.

L'handle non è valido. (Eccezione da HRESULT: 0x80070006 (E_HANDLE)) Descrizione: si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Si prega di rivedere la traccia dello stack per ulteriori informazioni sull'errore e sulla sua origine nel codice.
System.Runtime.InteropServices.COMException: l'handle non è valido. (Eccezione da HRESULT: 0x80070006 (E_HANDLE))
COMException (0x80070006): l'handle non è valido. (Eccezione da HRESULT: 0x80070006 (E_HANDLE))] [HttpException (0x80004005): si è verificato un errore durante la comunicazione con l'host remoto. Il codice di errore è 0x80070006.]

Come può essere risolto?

string strRequest = Convert.ToString(Request.QueryString.Get("file")); 
System.IO.FileInfo file = new System.IO.FileInfo(strRequest); 
if (file.Exists) 
{ 
    Response.Clear(); 
    Response.ContentType = ReturnExtension(System.IO.Path.GetExtension(file.Name)); 
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + file.Name); 
    Response.TransmitFile(strRequest); 
    Response.End(); 
    HttpContext.Current.ApplicationInstance.CompleteRequest(); 
    //DownloadFile(file.FullName, file.Name); 
} 
+0

'Si è verificato un errore durante la comunicazione con l'host remoto. Il codice di errore è 0x80070006. –

+0

Ho intenzione di indovinare che si tratta di un problema di autorizzazione a causa dell'hosting condiviso. –

+0

Per favore dimmi quale permesso dovrebbe essere dato? –

risposta

2

MODIFICA: mancava inizialmente la parte relativa alla pagina di caricamento fine. Non sono esattamente sicuro di ciò che viene passato dalla tua querystring, ma hai provato a utilizzare Server.MapPath? Così, invece di

System.IO.FileInfo file = new System.IO.FileInfo(strRequest); 

avete

System.IO.FileInfo file = new System.IO.FileInfo(Server.MapPath(strRequest)); 

fatemi sapere se questo aiuta.

+0

no non è una versione probelm penso che se è una versione probabilmente tutto il sito darà lo stesso errore ma non è il caso, ogni cosa sta funzionando bene eccetto questo, più approfondisco il problema e ho scoperto che questo errore si produceva quando usa Page.Redirect ("download.aspx"); provo un altro mehtod apro un download.aspx in javascript finestra popup funziona bene.non riesco ancora a capire il poblem, questo metodo funziona bene solo in Firefox in Internet Explorer solo popup aperta e finestra di dialogo di download non appare :( –

14

Creare un file .bat, inserire il comando seguente ed eseguire il file. Ucciderà tutti i processi del server web esistenti e dovrebbe risolvere il problema. Ho avuto lo stesso problema e ha funzionato per me. Ringrazia molto

taskkill /fi "imagename eq webdev.webserver40.exe" 
+2

webdev.webserver40. exe è il webserver di sviluppo integrato in Visual Studio, non è vero? Come può essere d'aiuto? – Fishcake

+0

Sì, anche il completamento del servizio mi ha aiutato. L'ho fatto manualmente. La vera causa è "l'operazione cross thread non è consentita" per me Il server di sviluppo di Visual Studio non riesce per questo stato.Penso che un servizio venga eseguito e si verifichi un problema incrociato. –

+0

Ho riavviato il mio server Web e questo ha impedito l'esecuzione dell'eccezione. Non sono ancora sicuro su come prevenirlo. –

9

ho trovato una correzione dal link qui sotto:

http://forums.asp.net/t/1387967.aspx?How+to+create+a+flipcart+like+panel+for+showing+products+in+gridview

if (file.Name == fileName) 

{ 
    Response.ClearContent(); 
    Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
    Response.AddHeader("Content-Length", file.Length.ToString()); 
    Response.TransmitFile(file.FullName); 
    //Response.End(); Will raise that error. this works well locally but not with IIS 
    Response.Flush();//Won't get error with Flush() so use this Instead of End() 


} 
+0

Si noti che Response.End() viene chiamato automaticamente al termine dell'esecuzione della pagina, quindi questa risposta potrebbe essere applicata anche se non si richiama esplicitamente Response.End(). Si noti inoltre che l'utilizzo di Respons e.TransmitFile() senza Response.Flush() funzionerà in Visual Studio, ma non funzionerà se distribuito su IIS. –

+1

In effetti il ​​codice sopra funziona quando quasi nient'altro ha funzionato. Stavo per andare a pensare con gli utenti IIS su un server di produzione con molti utenti attivi che funzionavano perfettamente bene (chissà cosa potrebbe rovinare gli utenti) Vorrei poterti dare più UpVotes! –

2

Nel mio caso stavo cercando di scrivere e leggere a questo file:

var path = System.IO.Path.GetTempFileName(); 

Ho usato il codice qui sotto e ha funzionato. Penso che all'utente di IIS mancasse il permesso di scrivere o leggere dal file temporaneo.

var path = Server.MapPath(@"~\App_Data\Stats"); 
Directory.CreateDirectory(path); 
path = Path.Combine(path, String.Format("{0}.csv", Guid.NewGuid())); 

using (var streamWriter = new StreamWriter(path)) 
using (var csvWriter = new CsvHelper.CsvWriter(streamWriter)) 
{ 
    csvWriter.Configuration.Delimiter = csvWriter.Configuration.CultureInfo.TextInfo.ListSeparator; 

    csvWriter.WriteRecords(rounds); 
} 

return File(path, "text/csv", "Stats.csv"); 
3

Ho appena risolto questo problema nel nostro ambiente. Abbiamo la rappresentazione attivata e il pool di applicazioni è in esecuzione come ApplicationPoolIdentity.

Il problema è stato causato dall'identità del pool di applicazioni che non ha accesso in lettura al file di origine anche se l'utente rappresentato ha avuto accesso al file. Ciò che ha reso questo difficile da risolvere è che se sia l'utente che il pool di app non hanno accesso si ottiene un errore di autorizzazione di accesso.

Problemi correlati