Как обрабатывать возврат null из пользовательского HttpHandler в asp.net?

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

Однако бывают случаи, когда изображение не существует, и я бы хотел, чтобы таблица html, содержащая изображение, стала невидимой, чтобы значок «изображение не найдено» не отображался.

Но поскольку HttpHandler не является синхронным, все мои попытки проверить размер изображения в Page_Load не увенчались успехом. Любые идеи о том, как это можно сделать?

РЕДАКТИРОВАТЬ::

Вот как это происходит до сих пор:

Это мой обработчик:

 public void ProcessRequest(HttpContext context)
        {
            using (Image image = GetImage(context.Request.QueryString["id"]))
            {
                context.Response.ContentType = "image/gif";
                image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
            }
        }

        private Image GetImage(string id)
        {
            try
            {
                System.IO.MemoryStream ms;
                byte[] rawImage;
                Image finalImage;
                // Database specific code!      
rawImage = getImageFromDataBase(id);

                ms = new System.IO.MemoryStream(rawImage, 0, rawImage.Length);
                ms.Write(rawImage, 0, rawImage.Length); 

                finalImage = System.Drawing.Image.FromStream(ms, true);

                return finalImage;
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("ERROR:::: " + ex.Message);
                return null;
            }
        }

И я использую это так:

myImage.ImageUrl = "Image.ashx?id=" + properId;

person jehuty    schedule 08.06.2010    source источник
comment
Да, пожалуйста, покажите нам какой-нибудь код, так как ваш вопрос может решаться по-разному, и мы хотим оказать вам конкретную помощь.   -  person Greg Olmstead    schedule 08.06.2010
comment
Код добавлен по запросу!   -  person jehuty    schedule 08.06.2010


Ответы (4)


Однако бывают случаи, когда изображение не существует, и я бы хотел, чтобы таблица html, содержащая изображение, стала невидимой, чтобы значок «изображение не найдено» не отображался.

Самый простой способ исправить это — проверить, существует ли изображение в Http-обработчике (в файле image.ashx) перед возвратом.

  if(image == null) {image = new blankImage();}

Если его там нет, замените его пустым изображением. Таким образом, это изображение не найдено. Если вы действительно хотите, чтобы оно исчезло и не сохраняло размер изображения, просто сделайте пустое изображение квадратом 1x1.

person kemiller2002    schedule 08.06.2010
comment
Однако у нас есть две проблемы. Программирование заключается в том, что изображение никогда не оценивается как нуль во время события загрузки страницы. Учитывая жизненный цикл страницы, image.ashx?id=XXX будет пытаться получить только после того, как загрузка страницы будет выполняться в течение длительного времени. Просто для полноты: 2-я проблема (требования) заключается в том, что таблица, содержащая изображение, имеет заголовки и строки заголовка, которые также должны быть, поскольку контента не будет! - person jehuty; 08.06.2010

Не можете ли вы просто использовать исключение NullReferenceException, или я неправильно понимаю вопрос?

try
{ 
    //try to get the photo
}
catch (NullReferenceException)
{
    //handle the error
}

Вы также можете проверить, image == null я полагаю, это может иметь больше смысла в вашей ситуации.

person Sir Graystar    schedule 08.06.2010
comment
Это может работать, однако, если возможно, вы хотите избежать использования try catch и исключений для управления потоком программы. - person Greg Olmstead; 08.06.2010
comment
Нет, я не думаю, что вы неправильно поняли - это просто так. Но тогда я бы использовал исключение для управления потоком приложения, не так ли? Поскольку в некоторых ситуациях ожидается отсутствие изображения! - person jehuty; 08.06.2010
comment
@Lerxst Да, именно мои мысли! - person jehuty; 08.06.2010
comment
Да, наверное, я просто поленился :P Я добавил дополнение. - person Sir Graystar; 08.06.2010

поскольку ashx запускается после page_load, вы можете заставить его возвращать квадрат 1x1, однако, если вы хотите полностью скрыть столбец, у вас возникнут некоторые проблемы из-за жизненного цикла.

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

person Greg Olmstead    schedule 08.06.2010

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

Это код, который я добавил на страницу:

public static bool CheckImageExistance(string url)
        {
            try
            {
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
                request.Method = "HEAD";       

                request.Credentials = CredentialCache.DefaultCredentials;

                HttpWebResponse response = request.GetResponse() as HttpWebResponse; 
                response.Close();
                return (response.StatusCode == HttpStatusCode.OK);
            }
            catch (Exception ex)
            {
                return false;
            }

И это работает так, как ожидалось. Спасибо за ваш вклад.

person jehuty    schedule 09.06.2010