【问题标题】:Pass argument to Generic Handler in C#将参数传递给 C# 中的通用处理程序
【发布时间】:2017-12-30 06:36:26
【问题描述】:

我有一个用于 ASP.NET 网站的通用处理程序 (.ashx),它允许我从存储在 SQL Server 数据库中的二进制数据中查看图像文件:

public class ImageProvider : IHttpHandler {

            public string connString = "...";

            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "image/jpeg";

                string sqlSelectQuery = "select img from Subjects Where [Id] = 'XXXX'";
                SqlConnection conn = new SqlConnection(connString);
                conn.Open();
                SqlCommand cmd = new SqlCommand(sqlSelectQuery, conn);

                byte[] img = (byte[])cmd.ExecuteScalar();
                context.Response.BinaryWrite(img);

            }

我目前正在使用简单的 Response.Redirect() 命令将处理程序连接到我网站的其余部分:

 Response.Redirect("ImageProvider.ashx");

我的问题是 - 在调用通用处理程序时如何传递任何类型的变量参数(sql 查询中的 XXX)?

非常感谢

【问题讨论】:

  • 通常使用处理程序,您将针对您希望它运行的文件类型/路径注册它,然后从请求路径中提取数据。
  • 我不确定我是否理解您所说的注册路径和文件类型是什么意思。 Magnus 的回答非常适合我的需求,但我很想了解更多

标签: c# asp.net generic-handler


【解决方案1】:
  • 使用HttpContext.Request.QueryStringHttpContext.Request.Form 接受来自HTTP 请求的值。
  • 使用SqlParameter。永远不要使用字符串连接。
  • 使用using() 块确保IDisposable 对象已正确关闭和处置。

像这样:

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "image/jpeg";

    String id = context.Request.QueryString("id");
    if( String.IsNullOrEmpty( id ) )
    {
        context.Response.StatusCode = 404;
        return;
    }

    using( SqlConnection c = new SqlConnection( connectionString ) )
    using( SqlCommand cmd = c.CreateCommand() )
    {
        c.Open();

        cmd.CommandText = "SELECT img FROM subjects WHERE [Id] = @id"
        cmd.Parameters.Add( "@id", SqlDbType.VarChar ).Value = id;

        Byte[] img = (Byte[])cmd.ExecuteScalar();
        context.Response.BinaryWrite( img );
    }
}

【讨论】:

    【解决方案2】:

    使用查询字符串。

    在 ProcessRequest 中:

    var Id = context.Request.QueryString["Id"];
    

    用法:

    Response.Redirect("ImageProvider.ashx?Id=100");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2015-01-30
      相关资源
      最近更新 更多