2010-01-11 3 views
3

У меня есть веб-приложение, в которое я загружаю изображение, изображение впоследствии сохраняется в папке temp сервера и отображается через веб-манипулятор на странице aspx.Веб-манипулятор не работает при обратной передаче

код для ASPX:

<img src="PreviewImageQualityHandler.ashx" alt="Picture not loaded" runat="server" id="imagePreview" /> 

код для загрузки изображения и добавление уникального идентификатора сессии:

protected void uploadButton_Click(object sender, EventArgs e) 
{ 
    if (FileUploadControl.FileName.EndsWith(".jpg") || FileUploadControl.FileName.EndsWith(".jpeg")) 
    { 
     string tempFileName = Path.GetTempFileName(); 
     FileUploadControl.SaveAs(tempFileName); 
     Session["tempName"] = tempFileName; 
     Response.Write(Session["tempName"]); 
     fileName = FileUploadControl.FileName; 
    } 
    else 
    { 
     Response.Write("<script>alert('Please select a .jpg/.jpeg image to upload')</script>"); 
    } 
} 

WebHandler код:

public class PreviewImageQualityHandler : IHttpHandler, IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     try 
     { 
      if (context.Session.Count > 0) 
      { 
       string sessID = context.Session["tempName"].ToString(); 
       Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile(sessID); 
       context.Response.ContentType = "image/jpg"; 
       MemoryStream ms = new MemoryStream(); 
       bmp.Save(ms, ImageFormat.Bmp); 
       byte[] b = ms.ToArray(); 
       context.Response.OutputStream.Write(b, 0, b.Length); 
      } 
     } 
     catch(Exception ex) 
     { 

     } 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

Моя проблема заключается в том, что веб-манипулятор запускается только при первой загрузке изображения. Если я попытаюсь загрузить новое изображение, он никогда не срабатывает.

Если я удаляю все, что связано с сеансом с веб-манипулятора, он срабатывает при каждом обратном вызове, как и следовало ожидать.

Если кто-то может пролить свет на мою проблему, я буду чрезвычайно благодарен!

С уважением

Фрэнсис

+0

К сожалению, Фрэнсис, я не могу повторить ошибку, которую вы видите. Возможно, есть что-то вне кода, который вы публикуете, что вызывает проблемы? Моя ставка была бы где-то в кешировании. Не уверен, что и где. –

ответ

4

ОК, переписывание моего ответа (см истории, если вы еще не видели ранее ответов). Несколько замечаний в вашем коде:

  1. Не используйте Response.Write. Вы не можете определить, когда он будет писать, и часто вы не увидите его в браузере. Используйте вместо этого asp:Literal или asp:Label. Связано с текущей проблемой, потому что: если вы не видите ее в браузере, возможно, вы думаете, что ничего не происходит.

  2. Вы не можете защитить открытие/закрытие файлового потока. Добавьте вокруг него using, чтобы поток был правильно закрыт и отключен. То, как вы это делаете в данный момент, файл останется открытым до тех пор, пока поток будет жив, и это довольно долго.

    using(Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile(sessID)) 
    { 
        //.. your code... 
        using(MemoryStream.... etc) 
        { 
         .... 
        } 
    } 
    

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

  3. Не уверен, что вы ожидаете от сеанса. Но, вероятно, лучше использовать некоторый идентификатор с изображением, сохранить его в базе данных с текущей информацией пользователя и добавить это как запрос к URL-адресу изображения. Таким образом, вы не можете попасть в неприятности с сессии вопросы:

    <img src="myimage.ashx?id=1234" /> 
    

    Либо, 1234 относится к чему-то на диске, или он относится к чему-то в базе данных, которая, в свою очередь, относится к чему-то на диске (гораздо более безопасным).

  4. Если вы не уверены в том, что браузер отправляет запрос, используйте FireBug с FireFox, который дает вам полную информацию о HTTP-запросах и ответах. Если вы используете одно и то же имя, браузер (если вы не в режиме отладки) не посылает новый запрос каждый раз.

  5. Вы используете обработчик исключений для всех catch.Напишите что-нибудь там или поместите точку останова в эту позицию. Весь обработчик исключений catch-all очень опасен: многие исключения никогда не будут видны. Вполне возможно, что ваш текущий код генерирует исключение (см. Пункт 2 выше), и все. Удалите обработчик исключений, и исключение поймает ваш отладчик Visual Studio, чтобы вы знали, что случилось.

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

+0

Спасибо МНОГО! Это была проблема кэширования изображения. Это может быть немного «непослушным», но «imagePreview.Src =» PreviewImageQualityHandler.ashx «+»? X = "+ DateTime.Now;" Избавь меня от моих страданий! Response.Write (""); предназначен только для целей отладки и будет удален. С уважением Francis – Francis

+0

Рад, что сейчас работает. Обратите внимание, что даже для целей отладки «Response.Write» может нанести ущерб вашему HTML или тому, как браузер отображает его, что может вызвать так много побочных эффектов, что он вызывает больше проблем, чем он решает. Вместо этого подумайте об использовании 'Debug.Write' для вывода отладки и просмотрите окно отладки Visual Studio. Также: при переходе на производство 'Debug.Write' не будет мешать вашему коду. – Abel

+0

Еще раз спасибо! Я обязательно переписал свой код, чтобы использовать «using». Я уже думал о вводе уникального идентификатора в БД, но из-за того, как пользователи вошли в систему, идентификатор пользователя недоступен в mypage.aspx? ID = 1234, поэтому мой коллега посоветовал мне не делать этого. Уловка без чего-либо в этом заключается для отладки, и там есть точка останова :). Я совершенно не знал о Debug.Write(). Я буду использовать это сейчас. Спасибо LOT за ваше время! С уважением Фрэнсис – Francis

Смежные вопросы