-1

我正在尝试编写一个 httphandler 来检索图像 url,然后将其显示在图像控件上我正在使用此代码,但它不起作用

OleDbConnection mDB = new OleDbConnection(
     ConfigurationManager.ConnectionStrings["AccessConnection"].ConnectionString);
     mDB.Open();
     OleDbCommand cmd = new OleDbCommand("select pProductId from Products where pProductId=" + context.Request.QueryString["ImageID"], mDB);
     OleDbDataReader rdr = cmd.ExecuteReader();
     rdr.Read();
     context.Response.BinaryWrite((byte[])rdr[0]);
     mDB.Close();
     context.Response.End(); */

抱歉,我之前在 SELECT 语句中造成了混淆,pProductId 不包含图像的 URL,而是 pProductImage 是包含 URL 的字段。我正在使用 Id 来确定要相应显示的图像。

这是我的预期输出:

<img src="ImgHandler.ashx?pProductId=2" alt="" />

我无法放置图像这是我的错误消息的链接:http: //imgur.com/Cix67

4

1 回答 1

1

这是一个两步的答案。在页面中,您可以执行以下操作:

        using (OleDbConnection mDB = new OleDbConnection(ConfigurationManager.ConnectionStrings["AccessConnection"].ConnectionString))
        {
            mDB.Open();
            using (OleDbCommand cmd = new OleDbCommand("select pProductId from Products where pProductId=" + context.Request.QueryString["ImageID"], mDB))
            {
                using (OleDbDataReader rdr = cmd.ExecuteReader())
                {
                    rdr.Read();
                    context.Response.Write("<img src=\"ImgHandler.ashx?pProductId=");
                    context.Response.Write((int)rdr[0]);  // I suppose pProductId is an int, adapt accordingly
                    context.Response.Write("\" />");
                }
            }
        }

并在隐式触发的 HTTP 处理程序中,如下所示:

public class MyHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        using (OleDbConnection mDB = new OleDbConnection(ConfigurationManager.ConnectionStrings["AccessConnection"].ConnectionString))
        {
            mDB.Open();
            // select the file data (I put pData here as a placeholder, and assume it will be a byte[])
            using (OleDbCommand cmd = new OleDbCommand("select pData from Products where pProductId=" + context.Request.QueryString["ImageID"], mDB))
            {
                using (OleDbDataReader rdr = cmd.ExecuteReader())
                {
                    rdr.Read();
                    context.Response.ContentType = "image/png";// put the content type here
                    context.Response.BinaryWrite((byte[])rdr[0]);
                }
            }
        }
    }
}

请注意使用模式,该模式可确保在使用后进行适当的资源清理。此外,理想情况下,您可以使用适当的缓存 HTTP 标头(如 if-modified-since)在客户端缓存数据,但这是另一回事......

于 2012-12-27T16:56:19.763 回答