0
我將圖像存儲在SQL Server 2000數據庫(BLOB類型)中。我的ASP.NET應用程序中有一個Web頁面,它需要向最終用戶顯示大量圖像,並且我想通過IHttpAsyncHandler處理瀏覽器對圖像的請求。我在代碼項目"Asynchronous HTTP Handler for Asynchronous BLOB DataReader." 上發現了一個模擬器帖子但由於某些原因,在完成「BeginProcessRequest」方法和「EndProcessRequest」方法完成後頁面凍結從未獲得調用。任何人都可以看看這個帖子,讓我知道這個帖子最新的錯誤?或者我需要做什麼來完成這項任務(通過IHttpAsyncHandler讀取BLOB)?BLOB通過IHttpAsyncHandler讀取
在這篇文章的源代碼是爲下
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
try
{
// image to retrieve
// this needs to change if setup a different path schema in the httpHandles web.config
string imgId = context.Request.Url.Segments[context.Request.Url.Segments.Length - 1];
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalBLOB"].ConnectionString);
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select image from BLOBTest where imgId='" + imgId + "'";
// store our Command to be later retrieved by EndProcessRequest
context.Items.Add("cmd", cmd);
// start async DB read
return cmd.BeginExecuteReader(cb, context,
CommandBehavior.SequentialAccess | // doesn't load whole column into memory
CommandBehavior.SingleRow | // performance improve since we only want one row
CommandBehavior.CloseConnection); // close connection immediately after read
}
catch (Exception exc)
{
// will return an image with the error text
this.renderError(context, "ERROR: " + exc.Message);
context.Response.StatusCode = 500;
context.Response.End();
// just to avoid compilation errors
throw;
}
}
/// <summary>
/// Provides an end method for an asynchronous process.
/// </summary>
/// <param name="result">An IAsyncResult that contains information about the status of the process.</param>
public void EndProcessRequest(IAsyncResult result)
{
HttpContext context = (HttpContext)result.AsyncState;
try
{
// restore used Command
SqlCommand cmd = (SqlCommand)context.Items["cmd"];
// retrieve result
using (SqlDataReader reader = cmd.EndExecuteReader(result))
{
this.renderImage(context, reader);
}
}
catch (Exception exc)
{
// will return an image with the error text
this.renderError(context, "ERROR: " + exc.Message);
context.Response.StatusCode = 500;
}
}
#endregion
#region IHttpHandler Members
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
// should never get called
throw new Exception("The method or operation is not implemented.");
}
#endregion
/// <summary>
/// Render a BLOB field to the Response stream as JPEG
/// </summary>
/// <param name="context">HttpContext of current request</param>
/// <param name="myReader">open SqlDataReader to read BLOB from</param>
private void renderImage(HttpContext context, SqlDataReader myReader)
{
// Size of the BLOB buffer.
const int bufferSize = 1024;
long startIndex = 0;
byte[] outbyte = new byte[bufferSize];
long retval;
myReader.Read();
context.Response.Clear();
context.Response.ContentType = "image/jpeg";
do
{
retval = myReader.GetBytes(0, startIndex, outbyte, 0, bufferSize);
// reposition the start index
startIndex += bufferSize;
// output buffer
context.Response.BinaryWrite(outbyte);
context.Response.Flush();
} while (retval == bufferSize);
}
/// <summary>
/// Renders an Error image
/// </summary>
/// <param name="context">HttpContext of current request</param>
/// <param name="msg">message text to render</param>
private void renderError(HttpContext context, string msg)
{
context.Response.Clear();
context.Response.ContentType = "image/jpeg";
// calculate the image width by message length
Bitmap bitmap = new Bitmap(7 * msg.Length, 30);
Graphics g = Graphics.FromImage(bitmap);
// create a background filler
g.FillRectangle(new SolidBrush(Color.DarkRed), 0, 0, bitmap.Width, bitmap.Height);
// draw our message
g.DrawString(msg, new Font("Tahoma", 10, FontStyle.Bold), new SolidBrush(Color.White), new PointF(5, 5));
// stream it to the output
bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
說實話,沒有看到*你的*代碼,我們真的不會有太大的幫助。 SO還有一些其他問題已經涵蓋了通過HTTPHandler將圖像流(數據庫blob)作爲圖像返回:http://stackoverflow.com/questions/385681/how-to-know-which-image-has -been-requested-c-asp-net/385948#385948,http://stackoverflow.com/questions/385945/problem-using-ihttphandler and http://stackoverflow.com/questions/386142/ihttphandler-example-required -for-image-type-files-c-asp-net/386171#386171(它有進一步的鏈接到提供Blob流的文章)。 – 2010-03-31 22:58:53
我試圖使用相同的代碼從那篇文章/後我在我的問題中提到。您可以將該帖子想象爲我的源代碼。 – shaniirfan 2010-04-01 01:41:22