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?
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.