How to implement IHttpHandler in a ContentHandler
- 100%
- 6.0
- Enterprise
- Community
Planned
Overview
There is a way to generate custom HTTP response without using the Sense/Net view engine or any other ASP.NET rendering. For this purpose you can implement a Content Handler as an IHttpHandler. For example you could create a Content Type for sitemap configurations and when the sitemap configuration Content is requested in a browser the ContentHandler for the type returns the sitemap with the given configuration in XML format - simply using the common IHttpHandler interface. This next tutorial shows you how it's done.
Steps
1. Create a new class
2. Implement content handler
Name your new class file MySitemapHandler and paste the following code into the file's editor window:
using System; using System.Text; using System.Collections.Generic; using System.Linq; using SenseNet.ContentRepository; using SenseNet.ContentRepository.Schema; using SenseNet.ContentRepository.Storage; namespace MySitemapHandler { [ContentHandler] public class MySitemapHandler : GenericContent { // =================================================================================================== Constructors // for initialize a new MyContentHandler instance public MySitemapHandler(Node parent) : this(parent, "MySitemap") { } // for initialize a new MyContentHandler inherited instance public MySitemapHandler(Node parent, string nodeTypeName) : base(parent, nodeTypeName) { } // for initialize instance in the loading operation protected MySitemapHandler(NodeToken nt) : base(nt) { } } }
This is the minimal content handler. This content handler won't store anything, won't have any setting and won't do any extra repository function, so this is good enough for a starting point.
3. Implement the IHttpHandler interface
Extend the class declaration line with the IHttpHandler declaration:
public class MySitemapHandler : GenericContent, IHttpHandler
If the interface is unknown, reference the System.Web.dll to the project and add the System.Web namespace to the "using" block.
using System.Web;
To add the implementation skeleton move the caret to the IHttpHandler word, press Alt+Shift+F10 and select Implement interface 'IHttpHandler'. After that you get some bonus code:
public bool IsReusable { get { throw new NotImplementedException(); } } public void ProcessRequest(HttpContext context) { throw new NotImplementedException(); }
Return with true value from the IsReusable property because this handler will be stateless and thread safe.
public bool IsReusable { get { return true; } }
4. Implement the ProcessRequest method
Implement the sitemap generator code that returns (for example) an XmlDocument (description of sitemap generator code is not a task of this article):
private XmlDocument GenerateSitemapFromPath(string path) { // generates the sitemap XML dom by the given path var doc = new XmlDocument(); // TODO: implement xml generation return doc; }
At the end you must integrate the sitemap generator into your content Handler.
public void ProcessRequest(HttpContext context) { // get sitemap DOM object var xml = GenerateSitemapFromPath(this.Path); // write XML to output context.Response.ContentType = "application/xml"; context.Response.Write(xml.OuterXml); // set ok context.Response.StatusCode = 200; }
5. Test the content handler
Create your new MySitemap content type if you have not yet done so. Handler attribute should point to the create content handler:
<?xml version="1.0" encoding="utf-8"?> <ContentType name="MySitemap" parentType="GenericContent" handler="MySitemapHandler.MySitemapHandler" xmlns="http://schemas.sensenet.com/SenseNet/ContentRepository/ContentTypeDefinition"> <DisplayName>MySitemap</DisplayName> <Description></Description> <Icon>Content</Icon> <Fields> </Fields> </ContentType>
Now in Content Explorer go to /Root/Sites/Default_Site and create a new MySitemap with the name sitemap (don't forget to add your MySitemap type to the allowed child types of the site). After that open a new window and request http://localhost/sitemap
. The generated xml output should appear in your browser.