Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

asp.net ashx request 404

Tags:

c#

asp.net

iis

ashx

I am using an ashx request handler to retrieve images and my breakpoint in the ashx file isn't being hit. When I use firebug I can see that the request is returning a 404 which makes me think that I need to configure some setting so that ashx file can be found.

I am using visual studio 2008 and .net 3.5.

ASHX file

namespace hybrid.content.Handlers
{
 public class DB_Images : IHttpHandler
 {
    public void ProcessRequest(HttpContext context)
    {
        Int32 image_id;
        if (context.Request.QueryString["id"] != null)
            image_id = Convert.ToInt32(context.Request.QueryString["id"]);
        else
            throw new ArgumentException("No parameter specified");

        context.Response.ContentType = "image/jpeg";
        Stream strm = GetImageFromDatabase(image_id);
        if (strm != null)
        {
            byte[] buffer = new byte[4096];
            int byteSeq = strm.Read(buffer, 0, 4096);

            while (byteSeq > 0)
            {
                context.Response.OutputStream.Write(buffer, 0, byteSeq);
                byteSeq = strm.Read(buffer, 0, 4096);
            }
            //context.Response.BinaryWrite(buffer);
        }
    }

    public Stream GetImageFromDatabase(int image_id)
    {
        SqlConnectionStringBuilder connstr = new SqlConnectionStringBuilder();
        //connstr.InitialCatalog = "dummy";
        //connstr.UserID = "sa";
        //connstr.Password = "password";
        //connstr.DataSource = "source";
        connstr.InitialCatalog = "smsdb";
        connstr.UserID = "user";
        connstr.Password = "password";
        connstr.DataSource = "10.31.4.79";

        SqlConnection conn = new SqlConnection(connstr.ConnectionString);
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        //            cmd.CommandText = "select image from cis_images where image_id = @p_image_id";
        cmd.CommandText = "select image from test_images where image_id = @p_image_id";
        cmd.Parameters.AddWithValue("@p_image_id", image_id);
        conn.Open();
        object img = cmd.ExecuteScalar();
        try
        {
            return new MemoryStream((byte[])img);
        }
        catch
        {
            return null;
        }
        finally
        {
            conn.Close();
            conn.Dispose();
        }
    }

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

Page click event

protected void Button1_Click(object sender, EventArgs e)
    {
        Image1.ImageUrl = "~/DB_Images.ashx?id=" + TextBox1.Text;
    }

ashx html

<%@ WebHandler Language="C#" CodeBehind="DB_Images.ashx.cs" Class="hybrid.content.Handlers.DB_Images" %>

There isn't any html apart from that reference.

Is there something that I am missing to get this to work?

like image 418
nick gowdy Avatar asked Oct 08 '22 23:10

nick gowdy


2 Answers

In my case I had the ashx file marked as a None content type instead of as Content, i.e. the Properties -> Build Action for it should have been Content, which mean that the ashx file wasn't included when Publishing the site.

like image 192
David d C e Freitas Avatar answered Oct 13 '22 11:10

David d C e Freitas


If you're using Generic Handlers in ASP.NET, there are a few things to check on.

1.) Make sure you have set the "32 bit application" flag in your application pool to 32 bit if it really is 32 bit. The default is "False".

2.) Turn the application pool from Integrated to Classic

3.) Change the .NET version in your application pool appropriately. In your case, use v2, since 3.5 uses version 2. .NET 4.0 uses .NET 4.0.

4.) Make sure ASP.NET is registered. Run everything in the code blocks.

C:\>cd C:\Windows\Microsoft.NET\Framework64\{version} C:\Windows\Microsoft.NET\Framework64{version}>aspnet_regiis.exe -i

5.) Choose the "ISAPI & CGI Restrictions" after right clicking the server name (not the site name) in IIS Manager, and right click the correct "ASP.NET {version}" line and chose "Allow".

6.) Make sure you have your Handler Mappings (for *.ashx) turned on (aka "Enabled") at the server level, or site level or explicitly in the web.config.

like image 29
MacGyver Avatar answered Oct 13 '22 11:10

MacGyver