第二个参数干扰通用处理程序

second parameter interfering with generic handler

我的问题是这样的。当我只有一个参数可供搜索时,我的图像控件可以工作,当我尝试传递第二个参数时,图像控件不起作用。 我使用通用处理程序作为 image.URL,因为我希望能够从数据库中提取图像,或者 select 从驱动器中提取图像以替换数据库副本。

好的,所以在删除了对版本的所有引用(这是导致问题的第二个参数)之后,我发现 ImageHandler.ashx 中的这一行 string version = context.Request.QueryString["Version"].ToString(); 导致了问题。

我的代码如下...

 public class ImageHandler : IHttpHandler
{       
    public void ProcessRequest(HttpContext context)
    {
        TemplateData imgData = null;
        string schemeCode = context.Request.QueryString["schemeCode"].ToString();
        string version = context.Request.QueryString["Version"].ToString();

        if(!String.IsNullOrEmpty(schemeCode)) imgData  = DataClass.ReturnData(schemeCode);


        if (imgData != null)
        {
            context.Response.ContentType = "image/jpeg";
            context.Response.BinaryWrite(imgData.Logo);
            context.Response.OutputStream.Write(imgData.Logo, 0, imgData.Logo.Length);

        }
    }

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

}

后面的男女同校......

        protected void btnSearch_Click(object sender, EventArgs e)
    {
        if (ddSchemeCode.SelectedIndex > 0)
        {
            // Existing Data to load from database
            TemplateData temp = DataClass.ReturnData(ddSchemeCode.SelectedItem.Text);
            if (temp != null)
            {

                txtVersion.Text = temp.Version;
                txtComment.Text = temp.Comment;
                txtSchemeCode.Text = temp.SchemeCode;
                txtTemplateId.Text = temp.TemplateId;
                imgLogo.ImageUrl = String.Format("ImageHandler.ashx?schemeCode={0}", ddSchemeCode.SelectedItem.Text);
            }
        }

ReturnData 方法...

        public static TemplateData ReturnData(string schemeCode)
    {
        string sqlInstructionCstmID = "SELECT TOP(1) LetterTemplateCustomisationId, TemplateId, Logo, SchemeCode, Version, Comment FROM LetterTemplateCustomisation WHERE SchemeCode ='" + schemeCode + "' ";

        string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LettersDatabase"].ConnectionString;
        SqlConnection connect = new SqlConnection(connectionString);

        SqlCommand command = new SqlCommand(sqlInstructionCstmID, connect);

        command.CommandType = CommandType.Text;

        connect.Open();

        SqlDataReader dr = command.ExecuteReader();

        TemplateData tempData = null;
        if (dr.HasRows)
        {
            dr.Read();
            tempData = new TemplateData(dr);
        }

        dr.Close();
        connect.Close();

        return tempData;
    }

所以如果我将额外的参数传递给 ReturnData 方法,则不会出现任何图像。

非常感谢你们。 谢谢

我创建了一个测试来模拟你正在尝试做的事情,错误只发生了一次,我再也无法重现了。我意识到我并不总是在编译代码。然后我开始一直编译,错误不再出现

您可以查看代码here

随便打电话 ~/Handler1.ashx?schemeCode=whatever&Version=a ~/Handler1.ashx?schemeCode=whatever&Version=b 要么 ~/Handler1.ashx?schemeCode=whatever&Version=c

您应该会看到三张不同的图片。

您在访问 QueryString 后立即调用 .ToString():

        string schemeCode = context.Request.QueryString["schemeCode"].ToString();
    string version = context.Request.QueryString["Version"].ToString();

如果您在测试中更改此行时忘记编译,您可能会出现一些不一致的行为,因为它可能会抛出 NullReferenceException。