Вот еще достаточно полезный кусочек знаний для новоиспеченных ASP.NET-чиков. Сегодня покажу вам как прятать от пользователей названия изображений сайта и папок сервера, в которых данные изображения находятся. Идея состоит в том, что пользователь не имеет возможности определить исходный путь и название изображения. В любом браузере, в свойствах изображения не будет отображаться путь к файлу изображения на сервере. Все, что увидит пользователь, это какой-то исполняемый файл, и только:

Кстати, расширенная версия хендлера рассматривается в следующей статье динамическое формирование пути изображения И так, поехали.
На странице, где вы хотите загружать требуемые изображения, поместите следующий тестовый код:
<body>
<form id="form2" runat="server">
<div>
<img id="Img1" runat="server"
src="~/BackFile.ashx" />
<br />
<asp:Image ID="Image1" runat="server"
ImageUrl="~/BackFile.ashx" />
</div>
</form>
</body>
Первое изображение вставлено с помощью тега <img />, второе - .NET – контрол <asp:Image />. Для тега <img /> назначили свойство src, а для контрола <asp:Image /> – ImageUrl в значение ="~/BackFile.ashx".
Как вы наверное догадались, это внешний обработчик – файл, который и будет отдавать требуемое изображение.
Ну а сам файл BackFile.ashx находится в корне сайта и содержит следующий код:
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.Web;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
public class Handler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
Image img = Image.FromFile(
context.Server.MapPath("IMAGES/image1.jpg"));
MemoryStream stream = new MemoryStream();
img.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] byteArray = new Byte[stream.Length];
stream.Position = 0;
stream.Read(byteArray, 0, (int)stream.Length);
System.IO.MemoryStream stream =
new System.IO.MemoryStream(byteArray);
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(byteArray);
}
public bool IsReusable
{
get
{
return false;
}
}
}
Или
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.Web;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
public class Handler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
Image img = Image.FromFile(
context.Server.MapPath("IMAGES/image1.jpg"));
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;
}
}
}
Мне по душе второй вариант – писать меньше, да и незачем лишний раз возиться с byte[] byteArray.
В итоге, если пользователь попытается узнать путь к графическому файлу на сервере, то он получит лишь путь к обработчику, а имя самого файла изображения и путь к нему узнать не сможет.