Как обработать нулевой возврат из пользовательского HttpHandler в asp.net? - PullRequest
1 голос
/ 08 июня 2010

Я использую пользовательский HxtpHandler из 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;

Ответы [ 4 ]

1 голос
/ 08 июня 2010

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

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

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

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

0 голосов
/ 09 июня 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;
            }

И все работает как положено. Спасибо за все комментарии.

0 голосов
/ 08 июня 2010

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

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

0 голосов
/ 08 июня 2010

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

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

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

...