#asp.net #asynchronous #httphandler
#asp.net #асинхронный #httphandler
Вопрос:
Я борюсь с плохой производительностью на одном из моих веб-сайтов. Он обрабатывает много изображений, и я отправляю изображения через обработчик изображений. При его создании я допустил ошибку и создал ASPX-файл для обработки изображений, мне следовало использовать универсальный обработчик (ASHX).
Я нашел этот хороший сайт, который выглядит многообещающе. Речь идет о создании обработчика изображений asynchronus. Но у меня очень мало знаний об этом, и мне нужна некоторая помощь.
Сайт справки:http://msdn.microsoft.com/en-us/magazine/cc163463.aspx
Вот как теперь выглядит мой ShowImage.aspx
файл:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Configuration;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web.Caching;
using System.Collections;
public partial class ShowImage : System.Web.UI.Page
{
Gallery gal = new Gallery();
private void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// Start with empty Response object.
Response.Clear();
// Get the image path from the URL.
string imagePath = Request.QueryString["image"];
// Set the size of the image
int maxHeight = 1000;
if (Request.QueryString["maxHeight"] != null)
{
string mh = Request.QueryString["maxHeight"];
maxHeight = int.Parse(mh);
}
int maxWidth = 1000;
if (Request.QueryString["maxWidth"] != null)
{
string mw = Request.QueryString["maxWidth"];
maxWidth = int.Parse(mw);
}
string thumbPath = gal.ThumbnailPath(Server.MapPath(imagePath), maxHeight, maxWidth);
byte[] buffer = null;
System.Drawing.Image img = System.Drawing.Image.FromFile(thumbPath);
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, img.RawFormat);
buffer = ms.ToArray();
}
Response.ContentType = "image/" Path.GetExtension(thumbPath).Remove(0, 1);
Response.OutputStream.Write(buffer, 0, buffer.Length);
img.Dispose();
Response.End();
}
}
}
Я начал с обработчика ShowImage.ashx
, но я немного застрял. Приветствуется любая помощь. Я не уверен, где я должен объединить свой код с этим.
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.IO;
public class ShowImage : IHttpAsyncHandler
{
//private ShowImageService _ts;
private ShowImageServiceAsyncResult _ar;
private HttpContext _context;
private Exception _ex;
public void ProcessRequest (HttpContext context)
{
// Never used
}
public bool IsReusable { get { return false; } }
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object state)
{
_context = context;
_ar = new ShowImageServiceAsyncResult(cb, state);
// SHOULD I PLACE CODE HERE?
return _ar;
}
public void EndProcessRequest(IAsyncResult ar)
{
if (_ex != null)
{
// If an exception was thrown, rethrow it
throw _ex;
}
else
{
// Otherwise return the generated image
}
}
}
class ShowImageServiceAsyncResult : IAsyncResult
{
private AsyncCallback _cb;
private object _state;
private ManualResetEvent _event;
private bool _completed = false;
private object _lock = new object();
public ShowImageServiceAsyncResult(AsyncCallback cb, object state)
{
_cb = cb;
_state = state;
}
public Object AsyncState { get { return _state; } }
public bool CompletedSynchronously { get { return false; } }
public bool IsCompleted { get { return _completed; } }
public WaitHandle AsyncWaitHandle
{
get
{
lock (_lock)
{
if (_event == null)
_event = new ManualResetEvent(IsCompleted);
return _event;
}
}
}
public void CompleteCall()
{
lock (_lock)
{
_completed = true;
if (_event != null) _event.Set();
}
if (_cb != null) _cb(this);
}
}
Ответ №1:
Вы не выполняете никаких асинхронных вызовов для извлечения вашего изображения, поэтому вам не нужен асинхронный обработчик.
Извлеките из IHttpHandler
и просто вставьте свой код ProcessRequest
.
Комментарии:
1. Хе-хе.. смущает, но факт. Спасибо 🙂