2014-08-29 1 views
0

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

Я подозреваю, что проблема связана с обработчиком 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(); 
    } 

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

+0

эй я думаю, что это проблема с хром, http://stackoverflow.com/questions/22219565/iis-chrome-failed-to-load-resource-neterr-incomplete-chunked-encoding –

+0

Ваш обработчик в порядке; если я подключу URL-адрес в браузере, я получаю изображение. –

+0

Получает ли 'GetMimeTypeFromMagic' (awesome method name btw) правильный тип содержимого? – PoweredByOrange

ответ

0

В коде, линия

context.Response.Close();

это проблема. Метод закрытия резко завершает поток ответов, см. Подробности here, а также проверяет этот связанный вопрос IIS & Chrome: failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING

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

0

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

System.Byte []

enter image description here

Очевидно, что не является частью изображения , Эта линия должна быть удалена:

context.Response.Write(buffer); 

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

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

s.CopyTo(context.Response.OutputStream);