ASP.NET ASHX请求404

5

我正在使用一个ashx请求处理程序来检索图像,但我的ashx文件中的断点并没有被触发。当我使用Firebug时,我可以看到请求返回了404,这让我认为我需要配置一些设置,以便找到ashx文件。

我正在使用Visual Studio 2008和.NET 3.5。

ASHX文件

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

页面点击事件

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" %>

除了引用外,没有任何html代码。

我是否忽略了某些内容以使其工作?


你能把处理程序的“html”视图上的内容(ashx文件的内容)粘贴出来吗? - Claudio Redi
IIS是否设置为提供处理程序? - Kyle Savage
1
如果您在浏览器中导航到httphandler会发生什么? - Claudio Redi
@Claudio Redi 我在'/'应用程序中收到服务器错误。无法找到该资源。说明:HTTP 404。您正在寻找的资源(或其某个依赖项)可能已被删除,更改了名称或暂时不可用。请检查以下URL并确保拼写正确。请求的URL:/DB_Images.ashx
版本信息:Microsoft .NET Framework版本:2.0.50727.5448; ASP.NET版本:2.0.50727.5456
- nick gowdy
1
ASHX文件是否已正确复制到您的部署位置? - Tetsujin no Oni
显示剩余5条评论
3个回答

2
在我的情况下,我把ashx文件标记为了“无”内容类型而不是“内容”。也就是说,它的属性->构建操作应该是内容(Content)。这意味着在发布网站时没有包括ashx文件。

2
如果你在ASP.NET中使用通用处理程序,有几个需要检查的事项。
1.) 确保如果是32位的话,在应用程序池中设置“32位应用程序”标志为32位。默认值为“False”。
2.) 将应用程序池从集成模式更改为经典模式。
3.) 在应用程序池中适当地更改.NET版本。在这种情况下,请使用v2,因为3.5使用版本2。.NET 4.0使用.NET 4.0。
4.) 确保已注册ASP.NET。在代码块中运行所有内容。
C:\>cd C:\Windows\Microsoft.NET\Framework64\{version} C:\Windows\Microsoft.NET\Framework64{version}>aspnet_regiis.exe -i 5.) 在IIS管理器中右键单击服务器名称(而不是站点名称),选择“ISAPI和CGI限制”,然后右键单击正确的“ASP.NET {version}”行并选择“允许”。
6.) 确保已启用Handler Mappings(用于*.ashx)在服务器级别、站点级别或显式在web.config中。

1
请问您能详细说明第6步吗?我已经在web.config中注册了我的特定ASHX,但不确定您所说的“*.ashx”是什么意思。 - Tim
我写成了“允许”。实际上应该写成“启用”。感谢你指出这个问题。 - Entree
Tim,我为了自己的目的再次回到这里。#4和#5是相互关联的。#6则完全不同。很抱歉在我上一条评论中向您披露了错误的信息。#4和#5允许将ashx文件安装(并启用/允许)由ASP.NET针对特定的.NET版本(默认情况下,IIS仅包含v2.*)。它们是ISAPI过滤器。#6(处理程序映射)允许ASP.NET解释何时应用于不同动词(GET、POST等)和应用程序或服务器中定义的类(处理程序)的某些映射(ashx、其他等)。 - Entree
我还翻转了#4和#5的顺序,因为#4是安装,#5是打开。默认情况下,在Windows中打开IIS时,v2.*过滤器将在该列表中(对于#5),而v4.*将被设置为“不允许”。将这些v4.*行更改为“允许”。 - Entree

0

我认为问题出在URL上。~/表示您的根目录。

 Use ResolveClientUrl("yourPathHere") or  ResolveUrl("yourPathHere").

要获取有关此错误的详细信息,请检查图像源并将其复制粘贴到地址栏中。将弹出一个包含详细信息的黄色页面。

我认为唯一的问题是URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接