第二个参数干扰通用处理程序
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。
我的问题是这样的。当我只有一个参数可供搜索时,我的图像控件可以工作,当我尝试传递第二个参数时,图像控件不起作用。 我使用通用处理程序作为 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。