Проблема, с которой вы столкнетесь при использовании HttpHandler, заключается в том, что он обычно включается только для запросов, обрабатываемых механизмом ASP.Net, - запросы на изображения обычно обрабатываются IIS без прохождения через обработчик.
Ваши веб-журналы должны быть в состоянии сказать вам, кто является реферерами для любого данного элемента на ваших серверах - при условии, что они у вас есть, и у вас есть что-то для их обработки - это будет более точным, чем при использовании Google.
В дальнейшем одним из способов, которыми я занимался в прошлом, является создание изображения, созданного HttpHandler (реализующим IHttpHandler).
Это вернет изображение в виде потока (установив тип содержимого "image / jpeg"), и вы сможете добавить дополнительную обработку (например, запись в журнал, откуда поступил запрос (реферер) и т. Д.).
Ограничение, которое я обнаружил с помощью HttpHandler, заключается в том, что для некоторых служб (например, PBBS) требуется ссылка на изображение, чтобы иметь расширение изображения. Я справился с этим, обработав все 404 с помощью страницы ASP.Net, которая проверяет наличие .jpg. продление в запросе. Если он находит один, вместо того, чтобы вернуть обычную страницу 404, он возвращает требуемое изображение. Вам нужно будет настроить обработчик 404 в IIS, поскольку обработчик ошибок web.config включается только для запросов ASP.Net (веб-сервисы и страницы типа .aspx).
Пример обработчика:
// Sample from the ASP.Net Personal Web Site Starter Kit
public class Handler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
// Set up the response settings
context.Response.ContentType = "image/jpeg";
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.BufferOutput = false;
// QueryString parameters are available here:
// context.Request.QueryString["QueryStringKey"]
// You can also access the Referrer object, and log the requests here.
Stream stream;
// Read your image into the stream, either from file system or DB
if (stream == null)
{
stream = PhotoManager.GetPhoto();
}
// Write image stream to the response stream
const int buffersize = 1024 * 16;
var buffer = new byte[buffersize];
int count = stream.Read(buffer, 0, buffersize);
while (count > 0)
{
context.Response.OutputStream.Write(buffer, 0, count);
count = stream.Read(buffer, 0, buffersize);
}
}
}
Вы можете иметь подобный код (или, что еще лучше, преобразовать основной код потоковой передачи изображений в общий класс) на странице 404, которая проверяет наличие расширения изображения и выводит изображение таким образом (опять же, настройка тип содержимого и т. д.).