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

时间:2015-06-01 10:32:35

标签: c# asp.net parameters webforms generic-handler

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

好的,所以在删除了对版本的所有引用(导致问题的第二个参数)后,我发现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方法,则不显示图像。

非常感谢大家。 感谢

1 个答案:

答案 0 :(得分:1)

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

您可以查看代码here

打电话 ?〜/ Handler1.ashx schemeCode =无论&安培;版本=一 ?〜/ Handler1.ashx schemeCode =无论&安培;版本= B 要么 ?〜/ Handler1.ashx schemeCode =无论&安培;版本= C

你应该看到三张不同的照片。

您在访问此行中的QueryString后立即调用.ToString():

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

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