В прошлой статье мы поговорили о том, как использовать хендлер *.ashx для генерирования скрытого пути к файлу изображения, которое отображается у пользователя в браузере, но не доступно ему на прямую (а только в контексте страницы сайта).
Но код, реализующий данный задум в предыдущей статье немного не доработан в отношении гибкости.
Дело в том, что файл BackFile.ashx нацелен на отдачу конкретно одного графического файла. Это хорошо лишь в том случае, если мы хотим скрыть реальный путь к одному конкретному файлу. Но чаще требуется скрыть имена всех папок, содержащих графические файлы и не только их. Напомню, что в данной статье я показую работу хендлера ashx на примере изображений, но он прекрасно показывает себя и в других ситуациях.
Если мы хотим генерировать динамически любые изображения, находящиеся в папке IMAGES (к примеру),

то предыдущий код следует переписать так:
public class Handler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
string fileName = "IMAGES/";
//если передан идентификатор файла
if (context.Request.QueryString["im"] != null)
fileName += "image" +
context.Request["im"].ToString() + ".jpg";
//иначе выводим «дежурное» изображение
else
fileName += "image1.jpg";
Image img = Image.FromFile(
context.Server.MapPath(fileName));
MemoryStream memStream = new MemoryStream();
img.Save(memStream,
System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ContentType = "image/jpeg";
memStream.WriteTo(context.Response.OutputStream);
}
public bool IsReusable
{
get
{
return false;
}
}
}
Ну а в разметке для любого динамически генерируемого изображения следует добавить параметр со значением идентификатора изображения (имя параметра и его значение вы сами можете выбрать и решить как будете из них «лепить» путь к графическому файлу):
<body>
<form id="form2" runat="server">
<div>
<img id="Img1" runat="server"
src="~/BackFile.ashx?im=2" />
<br />
<asp:Image ID="Image1" runat="server"
ImageUrl="~/BackFile.ashx" />
</div>
</form>
</body>
Первое изображение создается с помощью параметра im=2. Это означает, что для него сгенерируется путь /IMAGESimage2.jpg. Второе изображение генерируется без параметра, а потому для него выводится путь по умолчанию. Конечно, привязавшись к любому DataSource, вы можете еще повысить гибкость вашей разметки, воспользовавшись следующей конструкцией:
<img runat="server" src="source.ashx?im=<%#ImageNumber%>" />
В итоге пользователь лишь увидит значение пути изображения ~/BackFile.ashx?im=2, что ровным счетом ему опять таки ни о чем не скажет.

Пользуйтесь.