web-dev-qa-db-fra.com

La poignée est invalide. (Exception de HRESULT: 0x80070006 (E_HANDLE))

J'ai un site Web dans un environnement d'hébergement partagé IIS 7. Il exécute .NET 3.5. J'ai un bouton de téléchargement pour télécharger un fichier à partir du serveur. 

Lorsque je déploie localement cette application sur IIS 6, elle fonctionne correctement. Sur le serveur d'hébergement partagé IIS 7, l'exception se produit.

La poignée est invalide. (Exception de HRESULT: 0x80070006 (E_HANDLE)) Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Consultez la trace de la pile pour plus d’informations sur l’erreur et son origine dans le code.
System.Runtime.InteropServices.COMException: le descripteur n'est pas valide. (Exception de HRESULT: 0x80070006 (E_HANDLE))
COMException (0x80070006): le descripteur n'est pas valide. (Exception de HRESULT: 0x80070006 (E_HANDLE))]] HttpException (0x80004005): une erreur s'est produite lors de la communication avec l'hôte distant. Le code d'erreur est 0x80070006.]

Comment cela peut-il être résolu?

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);
}
19
Salman Roy

Créez un fichier .bat, entrez la commande suivante et exécutez le fichier. Il va tuer tous les processus de serveur Web existants et devrait résoudre le problème. J'ai eu le même problème et cela a fonctionné pour moi. Merci beaucoup

taskkill  /fi "imagename eq webdev.webserver40.exe" 
14
asim

J'ai trouvé un correctif à partir du lien ci-dessous:

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()


}
12
Ricky

Je viens de résoudre ce problème dans notre environnement. L'emprunt d'identité est activé et le pool d'applications s'exécute en tant que ApplicationPoolIdentity.

Le problème était dû au fait que l'identité du pool d'applications n'avait pas d'accès en lecture au fichier source, même si l'utilisateur empruntant l'identité avait accès au fichier. Ce qui a rendu cette tâche difficile à résoudre est que si l'utilisateur et le pool d'applications n'ont pas accès, vous obtenez une erreur d'autorisation d'accès.

3
Andrew Rose

Dans mon cas, j'essayais d'écrire et de lire dans ce fichier:

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

J'ai utilisé le code ci-dessous et cela a fonctionné. Je pense que l'utilisateur IIS n'avait pas l'autorisation d'écrire ou de lire dans le fichier temporaire.

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");
2
Akira Yamamoto

EDIT: A manqué la partie sur le chargement de page bien initialement. Je ne sais pas exactement ce qui est transmis par votre chaîne de requête, mais avez-vous essayé d'utiliser Server.MapPath? Donc au lieu de

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

tu as

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

Faites-moi savoir si cela vous a été utile.

2
joelmdev

Dans mon cas, cela ne s'est produit que pour un nom d'utilisateur spécifique. Tous les autres utilisateurs le faisaient fonctionner. 

Le problème était un espace blanc supplémentaire dans LoginEmail de l'utilisateur.  

Cela s'est produit dans une application MVC, qui utilisait Asp.net Identity, et Emprunt d'identité pour télécharger un fichier Excel à partir d'un répertoire hébergé sur le serveur d'hébergement.

Trucs bizarres!

0
t_plusplus