it-roy-ru.com

Дескриптор недействителен. (Исключение из HRESULT: 0x80070006 (E_HANDLE))

У меня есть веб-сайт в IIS 7 среде общего хостинга. Это работает .NET 3.5. У меня есть кнопка загрузки, чтобы загрузить файл с сервера. 

Когда я локально развертываю это приложение в IIS 6, оно работает нормально. На сервере IIS 7 общего хостинга возникает исключение.

Дескриптор недействителен. (Исключение из HRESULT: 0x80070006 (E_HANDLE)) Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
System.Runtime.InteropServices.COMException: дескриптор недействителен. (Исключение из HRESULT: 0x80070006 (E_HANDLE))
COMException (0x80070006): дескриптор недействителен. (Исключение из HRESULT: 0x80070006 (E_HANDLE))] [HttpException (0x80004005): Произошла ошибка при обмене данными с удаленным хостом. Код ошибки: 0x80070006.]

Как это можно решить?

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

Создайте файл .bat, введите следующую команду и запустите файл. Это убьет все существующие процессы веб-сервера и должно решить проблему. У меня была такая же проблема, и она сработала для меня. Большое спасибо

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

Я нашел исправление по ссылке ниже:

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

Я только что решил эту проблему в нашей среде. У нас включена олицетворение, и пул приложений работает как ApplicationPoolIdentity.

Проблема была вызвана тем, что удостоверение пула приложений не имело доступа для чтения к исходному файлу, несмотря на то, что олицетворенный пользователь имел доступ к файлу. Решить эту хитрость было то, что если пользователь и пул приложений не имеют доступа, вы получаете ошибку разрешения доступа.

3
Andrew Rose

В моем случае я пытался написать и прочитать в этот файл:

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

Я использовал код ниже, и он работал. Я думаю, что у пользователя IIS отсутствует разрешение на запись или чтение из временного файла.

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

Правка: Первоначально пропустили часть о загрузке страницы нормально. Я не совсем уверен, что передается из вашей строки запроса, но вы пытались использовать Server.MapPath? Так что вместо

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

у тебя есть

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

Дайте мне знать, если это поможет.

2
joelmdev

В моем случае это произошло только для конкретного пользователя. У любого другого пользователя это работало. 

Проблема заключалась в дополнительном пустом месте в LoginEmail пользователя.  

Это произошло в приложении MVC, которое использовало Asp.net Identity и Impersonation для загрузки файла Excel из каталога, который находится на хост-сервере.

Странные вещи!

0
t_plusplus