2009-10-02 59 views
3

长期以来流录入数据库的图片现在就涉及到我的本地计算机上录入数据库图像的Web应用程序项目时,我已经发现了一些恼人的。就本地而言,我的意思是这是在我的工作站上使用VS 2008和SQL Server 2005的典型环境。每当我使用HttpHandler在本地显示图像时,只有一些图像在每个页面上呈现。使用的HttpHandler

然而,当我推应用程序托管环境中,问题通常会消失。但是,我只是将一个新项目推送到托管环境,并遇到了与本地相同的问题 - 这次该站点和数据库位于托管环境中的同一台服务器上。有没有人知道这里发生了什么?

这里的处理程序:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class FeaturedHandler : IHttpHandler 
{ 
    Business biz = new Business(); 

    public void ProcessRequest(HttpContext context) 
    { 
     if (context.Request.QueryString["ListingID"] != null) 
     { 
      int listingID = Convert.ToInt32(context.Request.QueryString["ListingID"]); 

      DataSet ds = biz.GetFeaturedImageByID(listingID); 
      DataRow row = ds.Tables[0].Rows[0]; 
      byte[] featureImage = (byte[])row["Photo"]; 
      context.Response.ContentType = "image/jpeg"; 
      context.Response.OutputStream.Write(featureImage, 0, featureImage.Length); 
     } 
     else 
      throw new ArgumentException("No ListingID parameter specified"); 
    } 

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

我一直在使用一个单独的服务器上的数据库尝试,但遇到同样的问题。我应该使用DataReader吗?

UPDATE 因为我正在读取二进制数据,所以最初我应该使用DataReader。

+1

可能相关:http://stackoverflow.com/questions/5500950/what-is-the-use-for-ihttphandler-isreusable – 2011-03-31 17:24:08

回答

3

我终于得到了所有图像通过改变IsReusable属性的值来渲染真正

public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 

显然,这保持了处理程序在内存中,并且能够处理多个请求。当设置为false时,它必须为每个传入请求创建一个处理程序的新实例。

+0

Doh!我不敢相信我们错过了这一点。我总是将“IsReusable”设置为true。我甚至没有在你的代码中看它。恭喜找到解决方案。 – 2009-10-09 15:21:20

+0

我真的很想知道如何在这种情况下将“IsReusable”设置为true。不应该有新的处理程序总是能够提供图像吗?这里的示例是流动动态大小的图像,并将“IsReusable”设置为false:http://www.c-sharpcorner.com/UploadFile/desaijm/HTTPHandlersForImages11152005062705AM/HTTPHandlersForImages.aspx – Leif 2013-01-31 09:48:39

+0

永远无法在此属性的MSDN上找到适当的文档,并且只能通过测试观察... – IrishChieftain 2013-01-31 14:44:06

0

如果直接提供图片,不要忘记设置正确的缓存头,即ETag的和过期。如果你不这样做,你真的会打你的数据库并耗尽你的带宽。

您需要处理以下HTTP标头:

  • ETag的
  • 过期
  • 的Last-Modified
  • 的if-match
  • 如果 - 无 - 匹配
  • 如 - 修改 - 自
  • 如果 - 未修改 - 自
  • 除非-Modified-Since的

对于例如HTTP处理程序做这个检查: http://code.google.com/p/talifun-web/wiki/StaticFileHandler

1

通过这样的:

每当我使用一个HttpHandler 显示器上的图像我的本地,只有一个 部分的图像呈现在每个页面上加载 。

你的意思是相同的图像能显示在不同的图像应该出现的地方,或某些图像出现,一些不显示呢?

在您的情况下,将isReusable切换为true的差异在于new Business();将被调用一次用于多个图像。如果isReusable为假,则每个图像将调用new Business();一次。这意味着如果您每页有几张图片,new Business();将在这个特定页面被多次调用。

此外,我强烈建议改变这个:

if (context.Request.QueryString["ListingID"] != null) 
{ 
    int listingID = Convert.ToInt32(context.Request.QueryString["ListingID"]); 

有:

string listingIdParam = context.Request.QueryString["ListingID"]; 
if (listingIdParam != null) 
{ 
    int listingID = Convert.ToInt32(listingIdParam); 

这将节省您空引用异常,通常仅表面负载。此外,上述内容将防止向请求提供错误的图像,尤其是在isReusable为true时。

我不能确定问题是什么,但我可以肯定地说,设置isReusable标志只是一种解决方法,并不能解决您的问题。此外,如果像这样的问题只能在特定的环境中重现,这意味着它或者是线程问题,或者请求处理(不同的Web服务器 - IIS6,IIS7,开发服务器)有一些差异。

也许发布Business类,它的构造函数可以揭示一些光。 另外我建议实施某种错误日志记录来捕获处理程序中的异常并对其进行检查。

+0

伟大的投入Branislav。一些照片根本不会呈现。今晚我会搜索原始代码并在此发布,谢谢:) – IrishChieftain 2011-03-31 16:42:22

+0

Branislav,我查了一下代码。显然,当我将DataSet换出DataReader时,我已经取消了对业务类的调用 - 对于读取二进制数据更有意义吗?我在内部编写了SQL查询。这似乎解决了这个问题。 – IrishChieftain 2011-04-10 01:00:13