【问题标题】:How to handle null return from custom HttpHandler in asp.net?如何处理asp.net中自定义HttpHandler的null返回?
【发布时间】:2010-06-08 17:54:59
【问题描述】:

我正在使用自定义 ashx HttpHandler 从数据库中检索 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;

【问题讨论】:

  • 是的,请给我们一些代码,因为您的问题可能有多种不同的方式,我们希望为您提供具体的帮助。
  • 按要求添加代码!

标签: c# asp.net image-manipulation httphandler ashx


【解决方案1】:

但是,在某些情况下, 图像将不存在,我想 让 html 表保存图像 变得不可见,所以“图像不 未显示”图标。

解决此问题的最简单方法是在返回之前检查图像是否存在于 Http 处理程序中(在 image.ashx 文件中。)。

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

如果不存在,请用空白图像替换它。这样,这不是未找到图像的图标。如果您真的希望它消失并且不保留图像大小,只需将空白图像设置为 1x1 正方形即可。

【讨论】:

  • 不过,这里有两个问题。编程之一是在页面加载事件期间图像永远不会评估为空。鉴于页面生命周期,image.ashx?id=XXX 只会在 Page Load 长时间执行后才尝试获取。仅出于完整性考虑:第二个问题(要求)是包含图像的表格有标题和标题栏也必须去,因为没有内容!
【解决方案2】:

你不能只使用 NullReferenceException,还是我误解了这个问题?

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

您还可以检查 image == null 我想,这在您的情况下可能更有意义。

【讨论】:

  • 这可能有效,但如果可能,您希望避免使用 try catch 和异常来控制程序流程
  • 不,我认为您没有误解 - 仅此而已。但是我会使用异常来控制应用程序的流程,不是吗?由于在某些情况下预计图像不存在!
  • @Lerxst 是的,我的想法完全正确!
  • 是的,我想我只是懒惰 :P 我添加了一个附加项。
【解决方案3】:

因为 ashx 在 page_load 之后被执行,你可以让它返回一个 1x1 的正方形,但是如果你想完全隐藏这个列,你会因为生命周期而遇到一些问题。

您可以在页面上创建一个占位符,并动态构建您的表格。如果您可以避免使用 ashx,而是在代码隐藏中进行图像检索和渲染,您将能够知道何时隐藏该列

【讨论】:

    【解决方案4】:

    尽管这会使页面获取图像两次,但我使用的是小图像并且在很少的页面上,所以我认为这是值得的。

    这是我添加到页面的代码:

    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;
                }
    

    它按预期工作。感谢您的所有意见。

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多