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?
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.
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.
I think the problem is in the url. ~/
means your root directory .
Use ResolveClientUrl("yourPathHere") or ResolveUrl("yourPathHere").
To get details about this error check the image's source and copy and paste it in the address bar. A yellow page consisting of the details will popup.
I think the only problem is the url.
来源:https://stackoverflow.com/questions/8912463/asp-net-ashx-request-404