c# - valido - El identificador no es válido.(Excepción de HRESULT: 0x80070006(E_HANDLE))
controlador no valido excepcion de hresult 0x80070006 (6)
Tengo un sitio web en un entorno de alojamiento compartido de IIS 7. Se está ejecutando .NET 3.5. Tengo un botón de descarga para descargar un archivo del servidor.
Cuando implemento localmente esta aplicación en IIS 6, funciona bien. En el servidor de alojamiento compartido de IIS 7, se produce la excepción.
El identificador no es válido. (Excepción de HRESULT: 0x80070006 (E_HANDLE)) Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.
System.Runtime.InteropServices.COMException: el identificador no es válido. (Excepción de HRESULT: 0x80070006 (E_HANDLE))
COMException (0x80070006): el identificador no es válido. (Excepción de HRESULT: 0x80070006 (E_HANDLE))] [HttpException (0x80004005): Se produjo un error al comunicarse con el host remoto. El código de error es 0x80070006.]
¿Cómo se puede resolver esto?
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);
}
Acabo de resolver este problema en nuestro entorno. Tenemos la suplantación activada y el grupo de aplicaciones se ejecuta como ApplicationPoolIdentity.
El problema se debió a que la identidad del grupo de aplicaciones no tenía acceso de lectura al archivo de origen, a pesar de que el usuario suplantado tenía acceso al archivo. Lo que hizo que esto sea difícil de resolver es que si el usuario y el grupo de aplicaciones no tienen acceso, se obtiene un error de permiso de acceso.
Cree un archivo .bat, ponga el siguiente comando y ejecute el archivo. Matará todos los procesos de servidor web existentes y debería solucionar el problema. Tuve el mismo problema y funcionó para mí. Muchas gracias
taskkill /fi "imagename eq webdev.webserver40.exe"
EDITAR: Se perdió la parte de la multa de carga de la página inicialmente. No estoy exactamente seguro de lo que se está pasando desde su cadena de consulta, pero ¿ha intentado usar Server.MapPath? Así que en lugar de
System.IO.FileInfo file = new System.IO.FileInfo(strRequest);
tienes
System.IO.FileInfo file = new System.IO.FileInfo(Server.MapPath(strRequest));
Déjame saber si eso ayuda.
En mi caso estaba tratando de escribir y leer este archivo:
var path = System.IO.Path.GetTempFileName();
Utilicé el siguiente código y funcionó. Creo que al usuario de IIS le faltaba permiso para escribir o leer desde el archivo temporal.
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");
En mi caso, esto ocurrió solo para un usuario específico. Todos los demás usuarios lo tenían funcionando.
El problema fue un espacio en blanco adicional en LoginEmail del usuario.
Esto sucedió en una aplicación MVC, que utilizaba la identidad de Asp.net y la suplantación para descargar un archivo de Excel desde un directorio que se encuentra en el servidor de alojamiento.
¡Cosas raras!
Encontré una solución en el siguiente enlace:
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()
}