Перед первым использованием обработчик необходимо настроить.
...
<system.web>
<httpHandlers>
...
<add path="ImageHandler.axd" verb="GET" type="AlphaOmega.Web.UI.ImageHandler, ImageHandler"/>
...
</httpHandlers>
...
</system.web>
...
<system.webServer>
<handlers>
<add name="ImageHandler" path="ImageHandler.axd" verb="GET" type="AlphaOmega.Web.UI.ImageHandler, ImageHandler"/>
</handlers>
</system.webServer>
С версии 2.x изменён способ конфигурирования сборки. Для регистрации теперь необходимо прописать новую конфигурационную секцию:
<configSections>
...
<section name="ImageHandler" type="AlphaOmega.Web.UI.Config.SectionConfig, ImageHandler, Culture=neutral"/>
</configSections>
После этого, можно использовать новую секцию:
<configuration>
...
<ImageHandler watermark="AlphaOmega" notFoundImage="~\img\noimage.jpg">
<cache path="~/Cache" createSubDirs="true"/>
</ImageHandler>
...
Способ конфигурирования сборки версии 1.х до версии 2.х
<appSettings>
...
<add key="ImageHandler.Cache.Folder" value="~/Cache"/>
<add key="ImageHandler.NotFoundImage" value="~\img\noimage.jpg"/>
<add key="ImageHandler.WaterMark" value="AlphaOmega"/>
...
</appSettings>
path
(ImageHandler.Cache.Folder) — Папка для кеширования изображений. В папке создаются изображения в формате: .\{MethodType}\{Width}x{Height}\createSubDirs
— Если подпапка для размера изображения не создана, то будет создана при первом запросе изображения с указанными шириной и высотой. (В предыдущей версии папка создавалась в любом случае)watermark
(ImageHandler.WaterMark) — Текст для водяного знака. Пока водяной знак рисуется по одному алгоритму.notFoundImage
(ImageHandler.NotFoundImage) — Изображение, которое отдаётся в случае, если метод не поддерживается или метод не вернул ничего.На этом интеграция обработчика в проекте завершена. Теперь необходимо зарегистрировать события для обработчика. Для примера, зарегистрируем обработчик в файле Global.asax:
public class Global : System.Web.HttpApplication { protected void Application_Start(Object sender, EventArgs e) { ImageBll bll = new ImageBll(); } }
Далее код класса ImageBll:
using System; using AlphaOmega.Web.UI; public class ImageBll { public ImageBll() { HandlerCollection storage = ImageHandlerMethods.Handlers; // Для этого метода вызов будет таким http://localhost/ImageHandler.axd?MethodType=0&Size=100x100&Key=100 storage.AddHandler(//Изображение товара 0,//Идентификатор метода, который передаётся через QueryString ImageMethod.Infinity,//Время кешироваия в часах. Если параметр null, то изображения не кешируются. Если параметр ImageMethod.Infinity, то кеширование безвременное. true,//Необходимо нарисовать водяной знак. Водяной знак рисоваться если результатирующее изображение больше 251x251. null,//Делегат на рисование изображения в памяти GetProductStream//Делегат на рисование изображения с файловой системы ); // Для этого метода вызов будет таким http://localhost/ImageHandler.axd?MethodType=0&Key=200 storage.AddHandler(//Полосковый код 1,//Идентификатор метода, который передаётся через QueryString null,//Время кешироваия в часах. Изображение кешировать не надо. false,//Водяной знак рисовать не надо. GetBarcode,//Делегат на рисование изображения в памяти null//Делегат на рисование изображения с файловой системы ); ... } public Stream GetProductStream(Object sender, ImageEventArgs e) { if(String.IsNullOrEmpty(e.ImageKey)) return null; else return GetImageStream(AppConfiguration.ImageHandler.AccesoryPathArg, e.ImageKey); } public Bitmap GetBarcode(Object sender, ImageEventArgs e) { if(String.IsNullOrEmpty(e.ImageKey)) return null; else return (Bitmap)Code128.MakeBarcodeImage(e.ImageKey, 2, true); } }
ImageMethod
, передав его в ImageHandlerMethods.Handlers.AddHandler(...)
в отличии от кода выше, создание экземпляра класса ImageMethod
позволяет указать массив разрешённых размеров по которым можно ресайзить оригинальное изображениеonImage
и onFile
, то сначала будет запрос к делегату onFile
. Если он вернёт null, то будет запрошен делегат onImage
.Cancel
аргументов ImageEventArgs
в true
. В таком случае, обработчик изображения не будет ничего отдавать. Т.е. за отдачу будет полностью ответственен метод получения изображения.Last-Modified
и If-Modified-Since
. В случае, если файл в кеше не изменился, то клиент получит Response.StatusCode = 304 (Not modified)