Ошибка при попытке использовать обработчик изображения в ASP.NET - PullRequest
0 голосов
/ 14 ноября 2011

Я взял следующий код из руководства, чтобы проверить его, и у меня возникла ошибка, говорящая, что Object reference not set to an instance of an object.

Обратите внимание, что это НЕ мой код, и поэтомупроблема связана с расшифровкой.

   public class ProductImageHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            Int32 id;
            if (context.Request.QueryString["id"] != null)
                id = Convert.ToInt32(context.Request.QueryString["id"]);
            else
                throw new ArgumentException("No parameter specified");

            context.Response.ContentType = "image/jpeg";
            Stream strm = GetFromDB(id);
            byte[] buffer = new byte[4096];
            int byteSeq = strm.Read(buffer, 0, 4096);

            while (byteSeq > 0)
            {
                context.Response.OutputStream.Write(buffer, 0, byteSeq);
                byteSeq = strm.Read(buffer, 0, 4096);
            }
            //context.Response.BinaryWrite(buffer);
        }

        public Stream GetFromDB(int id)
        {
            string conn = ConfigurationManager.ConnectionStrings["DB"].ConnectionString;
            SqlConnection connection = new SqlConnection(conn);
            string sql = "SELECT Image FROM Products WHERE ID = @ID";
            SqlCommand cmd = new SqlCommand(sql, connection);
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@ID", id);
            connection.Open();
            object img = cmd.ExecuteScalar();
            try
            {
                return new MemoryStream((byte[])img);
            }
            catch
            {
                return null;
            }
            finally
            {
                connection.Close();
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

    }

Ошибка возникает в следующей строке:

int byteSeq = strm.Read(buffer, 0, 4096);

Кто-нибудь имеет какие-либо идеи относительно того, чтопроблема может быть?

Ответы [ 5 ]

0 голосов
/ 14 ноября 2011

Если поставить объект img = cmd.ExecuteScalar ();В строке внутри блока try вы можете изменить catch, чтобы он перехватывал фактический объект исключения, а не просто возвращал null.

0 голосов
/ 14 ноября 2011

Ваш метод GetFromDB возвращает ноль, когда генерируется исключение (кстати, ick) ... поэтому я бы посоветовал пройти через него, чтобы выяснить, почему.

0 голосов
/ 14 ноября 2011

Это, вероятно, потому что GetFromDB возвращает ноль. Вы не должны возвращать ноль, когда вы ловите исключение в GetFromDB, или если вы это делаете, вы должны проверить, что возвращаемое значение не равно нулю. Постарайтесь не ловить исключение, это покажет вам, в чем проблема.

0 голосов
/ 14 ноября 2011

Совершенно очевидно, что эта строка возвращает ноль:

Stream strm = GetFromDB(id);

Проверьте, содержит ли этот метод правильную реализацию и существует ли предоставленный идентификатор.

0 голосов
/ 14 ноября 2011

Что ж, единственный доступ к элементу в самой строке находится на strm, поэтому я предполагаю, что это ссылка null.

Проверьте, что GetFromDB возвращает для конкретного запроса.Я предполагаю, что он вернет null, если id не найден.

Stream strm = GetFromDB(id);

Чтобы решить эту проблему, либо:

  • Обновите GetFromDB, чтобы не возвращатьnull
  • Проверьте переданный в id, чтобы убедиться, что он действителен
  • Убедитесь, что strm не является null перед его использованием
...