Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ4 ЛабграфWEB_.doc
Скачиваний:
6
Добавлен:
14.05.2015
Размер:
415.23 Кб
Скачать

Лабораторная работа. Работа с WEB графикой на С# в Visual Studio

Цель работы : освоение инструментов поддержки проектов с WEB графикой на С# в Visual Studio

ЗАДАНИЕ: Из приведенных фрагментов кодов собрать проекты ASP.NET,

поддерживающие приведенные изображения (декларировать препроцессорами классы )

Два подхода к отображению графической информации в ASP.NET

Как известно, графика в HTML отображаются через запрос в URL (src), с прямым указанием имя и расширения файла. Однако - если графический образ хранится где-то, например, в БД, или формируется динамически, то мы должны запросить адрес страницы, где формируется изображение и, далее, как-то превратить этот запрос в принятую форму вывода изображения. То есть, нельзя вернуть запрошенный графический объект как некую последовательность байт, а необходимо его интерпретировать или, иначе, преобразовать в картинку, а запрос трактовать как URL к графическому объекту.

Для этой цели служит класс HttpResponse, который предназначен для формирования данных ответа на запрос HTTP. Cвойство класса HttpResponse.OutputStream - позволяет сформировать вывод двоичных данных в теле исходящего содержимого ответа на НТТР запрос. Оба, рассматриваемых ниже метода, используют OutputStream класса HttpResponse и отличаются лишь тем, что в первом случае создается собственный обработчик конкретного запроса, а во втором случае используется отдельная Web страница для формирования двоичного потока данных, соответствующая графическому образу.

Отображение графической информации с использованием HttpHandler

ASP.NET обрабатывает запросы HTTP с помощью обработчика HttpHandler, который доступен по умолчанию для всех запрашиваемых страниц c расширением *.aspx и служб (*.asmx). HttpHandlers - это классы, реализующие интерфейсы IHttpHandler и IHttpAsyncHandler и, по существу, служат ISAPI фильтром, обработки http запросов. Запросы могут обрабатываться как синхронно (интерфейс System.Web.IHttpHandler) - HttpHandler возвращает управление по завершению обработки запроса или асинхронно (интерфейс System.Web.IHttpAsyncHandler) - путем запуска процессов обработки и возврата управления. Иначе - HttpHandlerы могут передавать выполнение запроса другим классам или же сами обрабатывают запрос и возвращают результат клиенту.

Важной особенностью ASP.NET является то, что HttpHandler может быть создан разработчиком для выполнения своих конкретных задач. Далее, мы рассмотрим создание своего собственного HttpHandler для отображения графической информации.

Создадим сайт с именем ws1. Пусть на основной странице Default.aspx необходимо отображать графическую информацию, которая будет создаваться некоторым классом MakeGraphiks, вызов которого будет обеспечивать обработчик HttpHandler. HTML код страницы:

<%@ Page Language="C#" AutoEventWireup="true"

CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title>Untitled Page</title>

</head>

<body>

<form id="form1" runat="server">

<asp:Image id="Image1" runat="server" Height="900px"

Width="800px" ImageAlign="Middle"></asp:Image>

</form>

</body>

</html>

Перейдем к разработки непосредственно HttpHandler. Для того, чтобы любой класс мог выполнять функции HttpHandlerа, необходимо реализовать в нем интерфейс System.Web.IHttpHandler или System.Web.IHttpAsyncHandler.

(Можно также создавать экземпляр обработчика HttpHandler с помощью класса, реализующего интерфейс IHttpHandlerFactory.)

Интерфейсы System.Web.IHttpAsyncHandler и System.Web.IHttpHandler должны включать методы ProcessRequest (обработчик запроса), свойства IsReusable (поддержика организация пулов). Для интерфейса System.Web.IHttpAsyncHandler требуются дополнительно методы BeginProcessRequest и EndProcessRequest(инициализация и завершение асинхронных вызовов).

Добавим к проекту класс с именем MyHandlerGraph и включим в него необходимые методы и свойства:

using System;

using System.Data;

using System.Configuration;

using System.Linq;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Xml.Linq;

using System.Drawing;

using System.IO;

using System.Drawing.Imaging;

public class MyHandlerGraph : IHttpHandler

{

#region IHttpHandler Members

public bool IsReusable

{

get { return true; }

}

public void ProcessRequest(HttpContext context)

{

HttpRequest Request = context.Request;

HttpResponse Response = context.Response;

//Здесь код обработки запроса

}

#endregion

}

Если при вызове HttpHandler используются сессии, то необходимо дополнить код методом GetHandler:

using System.Web.SessionState;

public virtual IHttpHandler GetHandler(HttpContext context,

string requestType, string url, string path)

{

return PageParser.GetCompiledPageInstance(url,

context.Server.MapPath("~/default.aspx"), context);

}

HttpHandler создан. Далее необходимо подключить его к приложению. Для чего в файле Web.config в секции <httpHandlers> добавим:

<httpHandlers>

.......

<add verb="GET" path="getgraph.aspx" type="MyHandlerGraph" />

</httpHandlers>

Буквально это означает, что при вызове страници getgraph.aspx необходимо запрос перенаправить HttpHandlerу MyHandlerGraph. Файл getgraph.aspx в сборке приложения реально не существует, однако для вызова HttpHandler достаточно либо непосредственно задать вызов, например:

<Image1 src="getgraph.aspx">

Либо воспользоваться следующим вызовам в Default.aspx.cs:

private void Page_Load(object sender, System.EventArgs e)

{

Image1.Attributes.Add("src","getgraph.aspx");

}

На данном этапе у нас есть зарегестрированный Handler - осталось заставить его работать по назначению.

Для начала, добавим к проекту класс (через контекстное меню) с именем MakeGraphiks.cs, который заставим формировать графическое изображение.

using System;

using System.Data;

using System.Configuration;

using System.Linq;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Xml.Linq;

using System.Drawing;

using System.Drawing.Drawing2D;

public class MakeGraphiks

{

private Bitmap objBitmap;

private Graphics objGraphics;

private Pen objPen;

public MakeGraphiks()

{

}

public Bitmap Create()

{

//Холст

objPen=new Pen(Color.Blue);

objBitmap = new Bitmap(800, 900);

//Графическое представление objBitmap

objGraphics = Graphics.FromImage(objBitmap);

objGraphics.Clear(Color.GhostWhite);

//Далее можем рисовать на холсте все,

//что нам хочется, задавая параметры пера,

//линий, кистей

objPen.DashStyle = DashStyle.Dot;

objPen.Width = 1;

objGraphics.DrawLine(objPen, 40, 0, 400, 0);

SolidBrush myBrush = new SolidBrush(Color.Silver);

objGraphics.FillRectangle(myBrush, 2, 2, 45, 78);

//И т.д и т.п

//в заключкнии возвращаем рисунок Handlerу

return objBitmap;

}//public Bitmap Create()

}

В этом месте можно забрать нарисованную картинку, для чего в MyHandlerGraph добавим код обработки запроса и необходимые пространства имен. Один из способов:

using System.Drawing;

using System.Drawing.Imaging;

using System.IO;

void IHttpHandler.ProcessRequest(HttpContext context)

{

HttpRequest Request = context.Request;

HttpResponse Response = context.Response;

using(MakeGraphiks mkgr=new MakeGraphiks())

{

Bitmap mygraph=mkgr.Create();

using(MemoryStream ms=new MemoryStream())

{

mygraph.Save(ms,ImageFormat.Png);

Response.Clear();

Response.ContentType = "image/png";

ms.WriteTo(Response.OutputStream);

}

}

}

Теперь при вызове странички Default.aspx будет отображаться графическая информация, созданная в классе MakeGraphiks.