2010-06-08 51 views
1

我使用自定义的ashx HttpHandler从数据库中检索gif图像,并在网站上显示它 - 当图像存在时,它效果很好。如何在asp.net中处理自定义HttpHandler的空返回?

但是,有些情况下,图像将不存在,我希望有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; 
+0

你能展示一些代码吗? – janhartmann 2010-06-08 17:58:10

+0

是的,请给我们看一些代码,因为你的问题可以有很多不同的方式,我们希望给你特定的帮助。 – 2010-06-08 17:59:52

+0

按要求添加代码! – jehuty 2010-06-08 18:20:30

回答

0

即使这会使页面获取图像两次,我使用的是小图片,而且页数很少,所以我认为这是值得的。

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

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

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

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

你也可以检查是否image == null我想,这可能在你的情况更有意义。

+0

这可能会起作用,但如果可能的话,您希望避免使用try catch和exceptions来控制程序流程 – 2010-06-08 17:59:18

+0

不,我认为您不会误解 - 就是这样。但后来我会用异常来控制应用程序的流程,不是吗?由于在某些情况下图像不在那里! – jehuty 2010-06-08 18:04:56

+0

@Lerxst是的,我的想法确切! – jehuty 2010-06-08 18:05:34

1

不过,也有当 图像将不存在的情况下,我想 有HTML表格保持图像 成为无形的,因此“图像不 发现”不显示图标。

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

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

如果不存在,请用空白图像替换它。这样,这是没有图像未找到图标。如果你真的想要它消失,而不是保持图像大小,只需使空白图像为1x1平方。

+0

虽然这里有两个问题。编程之一是在页面加载事件期间图像从不计算为空值。鉴于页面生命周期,image.ashx?id = XXX只会在Page Load长时间执行后尝试获取。只是为了完整性:第二个问题(需求)是,持有图像的表具有标题和标题栏,因为不会有内容! – jehuty 2010-06-08 18:26:23

0

由于ashx在page_load之后被执行,所以您可以让它返回1x1的正方形,但是如果您想完全隐藏该列,您将因为生命周期而出现一些问题。

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

相关问题