Если бы вы делали это, используя ASP.NET 3.5 Sp1 WebForms, вам пришлось бы создать отдельный ImageHTTPHandler, который реализует IHttpHandler для обработки ответа. По сути, все, что вам нужно сделать, это поместить код, который в настоящее время находится в методе GetHttpHandler, в метод ProcessRequest вашего ImageHttpHandler. Я также переместил бы метод GetContentType в класс ImageHTTPHandler. Также добавьте переменную для хранения имени файла.
Тогда ваш класс ImageRouteHanlder будет выглядеть так:
public class ImageRouteHandler:IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
string filename = requestContext.RouteData.Values["filename"] as string;
return new ImageHttpHandler(filename);
}
}
и ваш класс ImageHttpHandler будет выглядеть так:
public class ImageHttpHandler:IHttpHandler
{
private string _fileName;
public ImageHttpHandler(string filename)
{
_fileName = filename;
}
#region IHttpHandler Members
public bool IsReusable
{
get { throw new NotImplementedException(); }
}
public void ProcessRequest(HttpContext context)
{
if (string.IsNullOrEmpty(_fileName))
{
context.Response.Clear();
context.Response.StatusCode = 404;
context.Response.End();
}
else
{
context.Response.Clear();
context.Response.ContentType = GetContentType(context.Request.Url.ToString());
// find physical path to image here.
string filepath = context.Server.MapPath("~/images/" + _fileName);
context.Response.WriteFile(filepath);
context.Response.End();
}
}
private static string GetContentType(String path)
{
switch (Path.GetExtension(path))
{
case ".bmp": return "Image/bmp";
case ".gif": return "Image/gif";
case ".jpg": return "Image/jpeg";
case ".png": return "Image/png";
default: break;
}
return "";
}
#endregion
}