views:

246

answers:

4

For a long time now I have noticed something annoying when working on Web Application projects involving databased images on my local machine. By local I mean that it's a typical environment with VS 2008 and SQL Server 2005 on my workstation. Whenever I use an HttpHandler to display the images on my local, only a portion of the images render on each page load.

However, when I push the application to a hosted environment, the problem usually disappears. However, I just pushed a new project out to a hosted environment and experienced the same problem as on my local - this time the site and the DB were on the same server in the hosting environment. Has anyone got a take on what's happening here?

Here's the handler:

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

I have tried using a DB on a separate server but encountered the same problem. Should I be using a DataReader instead?

UPDATE I should have used a DataReader initially since I am reading binary data.

A: 

Take a look at http://www.c-sharpcorner.com/UploadFile/desaijm/HTTPHandlersForImages11152005062705AM/HTTPHandlersForImages.aspx

adatapost
I'm using IIS7 and the handlers classes are in my root project. I don't think I need to register these handlers in the Web.Config, or am I wrong?
IrishChieftain
+1  A: 

I encountered a similar situation, in my case the photos did not completely upload to the server.

Chuck Conway
I used the same image for different records and it appeared for some...
IrishChieftain
+1  A: 

I finally got all images to render by changing the value of the IsReusable property to true:

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }

Apparently, this keeps the handler in memory and able to handle multiple requests. When set to false, it had to create a new instance of the handler for each incoming request.

IrishChieftain
Doh! I can't believe we missed that. I always set "IsReusable" to true. I didn't even look at it in your code. Congrats on finding a solution.
Chuck Conway
A: 

If you are serving images directly, do not forget to set the correct caching headers, i.e. etags and expires. If you don't you are really going to hit your database hard and use up your bandwidth.

You will need to handle the following http headers:

  • ETag
  • Expires
  • Last-Modified
  • If-Match
  • If-None-Match
  • If-Modified-Since
  • If-Unmodified-Since
  • Unless-Modified-Since

For an example http handler that does this check out: http://code.google.com/p/talifun-web/wiki/StaticFileHandler

Taliesin