Картинка блога

В современных WEB приложениях часто бывает недостаточно создания HTML страниц, но нужна поддержка, скажем, RSS или JSON.

Распространенным способом можно считать создание ASPX страницы с измененным MIME типом.

public class XMLPage : System.Web.UI.Page
{

	private void Page_Load(object sender, System.EventArgs e)
	{
		Response.ContentType = "text/xml";
		Response.ContentEncoding = Encoding.UTF8;

		string sXml = BuildXMLString(); //Создать XML

		Response.Write( sXml );
		Response.End();
	}
}

Такой подход неплохо работает, и ничего особенно плохого в нем нет, однако наш класс унаследован от класса Page, что не совсем правильно и требует несколько больше ресурсов чем нашему обработчику действительно нужно.

Альтернативным методом может быть создание HTTP хендлера, и специальной .ASHX страницы. Хендлер в последствии может быть привязан как обработчик любого другого расширения.

И так, начать стоит с создания самой .ASHX страницы:

<!--WebHandler Language="C#" Class="MyProject.XMLHandler"-->

Этой одной строки будет достаточно. 🙂 Теперь, при запросе страницы, сервер будет знать, что обработчик находится в классе MyProject.XMLHandler.  Код класса может быть следующим:

public class XMLHandler : IHttpHandler
{
	public void ProcessRequest (HttpContext context)
	{
		context.Response.ContentType = "text/xml";
		context.Response.ContentEncoding = System.Text.Encoding.UTF8;
		string sXml = BuildXMLString(); //Создать XML
		context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(600));
		context.Response.Cache.SetCacheability(HttpCacheability.Public);
		context.Response.Write( sXml );
	}
	public bool IsReusable
	{
		get { return true; }
	}
}

Наш хэндлер должен реализовать интерфейс IHttpHandler. Согласно спецификации IsReusable говорит серверу, нужно ли инстанцировать класс для каждого запроса, это не кэш, так что в большинстве случаев, метод будет возвращать true.

Теперь, сервер не будет выполнять лишних действий по созданию «тяжелого» класса Page с большим количеством бесполезных на данный момент событий, и в итоге мы получим именно то, что нам надо.

Метки:, ,

Один комментарий в “Создаем ASHX хендлер в ASP.NET”

  1. Спасибо! Написано очень толково и со знанием дела!