Это объясняется тем, что когда вы используете BinaryWrite() для возврата "сырого" изображения, то теряете возможность добавлять любое дополнительное HTML-содержимое.

Чтобы справиться с этой проблемой, нужно создать другую страницу, которая вызовет ваш код, генерирующий изображение. Лучший способ сделать это — заменить вашу страницу, генерирующую изображение, выделенным обработчиком HTТР, который сгенерирует графический вывод. Таким образом, вы сэкономите на накладных расходах полной модели Web-форм ASP.NET, которую вы все равно не можете здесь использовать (обработчики HTTP рассматриваются в главе 5).

Создать, нужный обработчик HTTP довольно просто. Вы просто должны создать класс, реализующий интерфейс IHttpHandler, с методом ProcessRequest(). Обработчик HTTP извлечет идентификатор записи, которую нужно отобразить из строки запроса. Так выглядит полный код обработчика HTTP:

public class ImageFromDB : IHttpHandler
{
  public void ProcessRequest(HttpContext context)
  {
    string connectionString =
      WebConfigurationManager.ConnectionStrings["Pubs"].ConnectionString;
    // Get the ID for this request.
    // Получить идентификатор (ID) для данного запроса.
    string id = context.Request.QueryString["id"];
    if (id == null)
      throw new ApplicationException("Must specify ID.");

    // Create a parameterized command for this record.
    // Создать параметризованную команду для данной записи.
    SqlConnection con = new SqlConnection(connectionString);
    string SQL = "SELECT logo FROM pub_info WHERE pub_id=@ID";
    SqlCommand cmd = new SqlCommand(SQL, con);
    cmd.Parameters.AddWithValue("@ID", id);
    try
    {
      con.Open();
      SqlDataReader r = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
      if (r.Read())
      {
        int bufferSize = 100; // Size of the buffer.
        byte[] bytes = new byte[bufferSize]; // The buffer.
        long bytesRead; // The # of bytes read.
        long readFrom = 0; // The starting index.
        // Read the field 100 bytes at a time.
        // Читать поле по 100 байт за раз.
        do
        {
          bytesRead = r.GetBytes(0, readFrom, bytes, 0, bufferSize);
          context.Response.BinaryWrite(bytes);
          readFrom += bufferSize;
        } while (bytesRead == bufferSize);
      }
      r.Close();
    }

  

предыдущая    следующая страница    вначало главы    оглавление

473

Hosted by uCoz