Обработчик ASP.NET не работает должным образом

Я создал обработчик Ashx на C#, который предоставляет мне изображения на основе параметра fileid, который передается мне. У меня также есть простой сценарий предварительного просмотра всплывающей подсказки, который я написал, но он не работает. Вы можете видеть загрузку изображения, но после загрузки изображение просто исчезает.

Я подозреваю, что проблема в обработчике ASHX, потому что, если я использую статическое изображение, оно работает нормально. Вот мой код обработчика ASHX:

    public void ProcessRequest(HttpContext context)
    {
        string fileId = HttpUtility.UrlDecode(context.Request.QueryString["fileId"] ?? "") ?? "";
        string fullFileName = context.Server.MapPath("~/Uploads") + "\\" + fileId;

        using (FileStream s = File.Open(fullFileName, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            context.Response.ContentType = HelperClasses.Utility.GetMimeTypeFromMagic(fullFileName);

            var buffer = new byte[s.Length];
            s.Read(buffer, 0, (int) s.Length);

            context.Response.BinaryWrite(buffer);
            context.Response.Write(buffer);

            s.Close();
        }
        context.Response.Flush();
        context.Response.Close();
    }

Кроме того, я создал скрипку, чтобы продемонстрировать проблему.


person Icemanind    schedule 29.08.2014    source источник
comment
эй, я думаю, что это проблема с хромом, stackoverflow.com/questions/22219565/   -  person Mike Miller    schedule 29.08.2014
comment
Ваш обработчик в порядке; если я подключу URL-адрес к браузеру, я получу изображение.   -  person Slippery Pete    schedule 29.08.2014
comment
Возвращает ли GetMimeTypeFromMagic (кстати, прекрасное имя метода) правильный тип контента?   -  person PoweredByOrange    schedule 29.08.2014
comment
Он отлично работает в IE...   -  person PoweredByOrange    schedule 29.08.2014
comment
В вашем обработчике замените строку context.Response.Close(); на context.Response.End(); и посмотрите, решит ли это проблему?   -  person Jawwad Alam    schedule 29.08.2014
comment
@JawwadAlam -- вот в чем проблема! Теперь он отлично работает! Сделайте ответ из своего комментария, и я приму его.   -  person Icemanind    schedule 29.08.2014
comment
@PoweredByOrange - файлы, которые у меня есть, не сохраняют расширения, поэтому я не знаю, что это за файл, поэтому функция GetMimeTypeFromMagic просматривает заголовок и магические байты, чтобы определить тип файла (отсюда и название). У меня также есть родственная функция GetExtensionFromMagic, которая делает что-то похожее, но возвращает расширение.   -  person Icemanind    schedule 29.08.2014


Ответы (2)


В вашем коде строка

context.Response.Close();

это проблема. Метод close резко завершает поток ответов, см. подробности здесь. а также проверьте этот связанный вопрос IIS & Chrome: не удалось загрузить ресурс: net::ERR_INCOMPLETE_CHUNKED_ENCODING

Замените строку на context.Response.End();, чтобы обычно заканчивать ответ.

person Jawwad Alam    schedule 29.08.2014

Вы бросаете мусор в конце ответа, особенно потому, что вы вызываете Response.Write в дополнение к BinaryWrite. Если вы посмотрите на ответ вашего обработчика, это в конце (буквально):

Система.Байт[]

введите здесь описание изображения

Очевидно, что это не часть образа. Эту строку следует удалить:

context.Response.Write(buffer);

Я бы также избегайте действий, подобных Response.End и Response.Close. Пусть об этом позаботится среда выполнения ASP.NET.

А еще лучше, если вы используете .NET Framework 4 или старше, вы можете упростить все это до этого:

s.CopyTo(context.Response.OutputStream);
person vcsjones    schedule 29.08.2014