[Mono-dev] Problems with IHttpHandler

Michał Ziemski rook at roo.k.pl
Fri Feb 22 10:06:42 EST 2008


Hi!

Are you sure you run it with mod_mono_server2 rather than the default 
mod_mono_server?

Cheers,
Michał Ziemski

Nik Radford pisze:
> Yes, this I've already done.
>
> Basically I'm doing a catch all for the http handler, the entry for my web
> config looks like so
>
>     <httpHandlers>
>         <add path="*" verb="*"
> type="TerminalDischarge.Web.HttpHandler.HttpHandler,
> TerminalDischarge.Web"/>
>     </httpHandlers>
>
> I'm using for URL rewritting. and the HttpHandler i'm using looks like this:
>
> (sorry if its a bit much, I just copy pasted the whole file)
>
> using System;
> using System.Collections.Generic;
> using System.Configuration;
> using System.IO;
> using System.Text;
> using System.Web;
> using System.Web.UI;
> using System.Xml;
> using TerminalDischarge.Web.Mapping;
>
> namespace TerminalDischarge.Web.HttpHandler
> {
>     public class HttpHandler : IHttpHandler
>     {
>         #region Internals
>         private readonly List<Map> m_Maps;
>         #endregion
>
>         #region Constructors
>         public HttpHandler()
>         {
>             m_Maps = new List<Map>();
>         }
>         #endregion
>
>         #region Public Members
>         ///<summary>
>         ///Enables processing of HTTP Web requests by a custom HttpHandler
> that implements the <see cref="T:System.Web.IHttpHandler"></see>
> interface.
>         ///</summary>
>         ///
>         ///<param name="context">An <see
> cref="T:System.Web.HttpContext"></see> object that provides
> references to the intrinsic server objects (for example, Request,
> Response, Session, and Server) used to service HTTP requests.
> </param>
>         public void ProcessRequest(HttpContext context)
>         {
>             AddPaths(context);
>             string url = context.Request.Path;
>
>             foreach (Map m in m_Maps)
>             {
>                 if (m.DoesMatch(url))
>                 {
>                     string destination = m.MapUrl(url);
>                     try
>                     {
>                         string fileName =
> context.Server.MapPath(destination);
>
>                         Page page =
> PageParser.GetCompiledPageInstance(destination,
> fileName, context) as Page;
>                         if (page != null)
>                         {
>                             context.RewritePath(destination);
>                             page.ProcessRequest(context);
>                             return;
>                         }
>                     }
>                     catch (HttpException)
>                     {
>                         PageNotFound(context);
>                         return;
>                     }
>                 }
>             }
>
>             {
>                 //no match found, so palm off to default handler
>                 System.Web.DefaultHttpHandler defaultHttpHandler = new
> DefaultHttpHandler();
>                 defaultHttpHandler.BeginProcessRequest(context, null, null);
>                 return;
>             }
>         }
>         #endregion
>
>         #region Private Members
>         /// <summary>
>         /// Displays a simple error if a path isn't found
>         /// </summary>
>         /// <param name="context"></param>
>         private void PageNotFound(HttpContext context)
>         {
>             context.Response.StatusCode = 404;
>             context.Response.Write(string.Format("The page {0} was not
> found", context.Request.Path));
>         }
>
>
>         /// <summary>
>         /// Parses the path mapping file and populates the map list
>         /// </summary>
>         /// <param name="context">An <see
> cref="T:System.Web.HttpContext"></see> object that provides
> references to the
>         /// intrinsic server objects (for example, Request, Response,
> Session, and Server) used to service HTTP requests. </param>
>         private void AddPaths(HttpContext context)
>         {
>
>             m_Maps.Clear();
>
>             //get mapping filename
>             string mapFile =
> context.Server.MapPath(ConfigurationManager.AppSettings["PathMap"]);
>
>             //Load it
>             XmlDocument xDoc = new XmlDocument();
>             xDoc.Load(mapFile);
>             XmlNodeList mapNodes = xDoc.SelectNodes("/Mapping/Map");
>
>             //we should get back a list of all our document mapping
>             //parse it and populate our map list
>             foreach (XmlNode node in mapNodes)
>             {
>                 XmlNode xSearchFor = node.SelectSingleNode("./SearchFor");
>                 XmlNode xSendTo = node.SelectSingleNode("./SendTo");
>
>                 if (xSearchFor != null && xSendTo != null)
>                 {
>                     string searchFor = xSearchFor.InnerText.Replace("~",
> context.Request.ApplicationPath);
>                     string sendTo = xSendTo.InnerText.Replace("~",
> context.Request.ApplicationPath);
>                     Map map = new Map(searchFor, sendTo);
>                     m_Maps.Add(map);
>                 }
>             }
>
>         }
>         #endregion
>
>         #region Properties
>         ///<summary>
>         ///Gets a value indicating whether another request can use the
> <see cref="T:System.Web.IHttpHandler"></see> instance.
>         ///</summary>
>         ///
>         ///<returns>
>         ///true if the <see cref="T:System.Web.IHttpHandler"></see>
> instance is reusable; otherwise, false.
>         ///</returns>
>         ///
>         public bool IsReusable
>         {
>             get { return true; }
>         }
>
>         #endregion
>     }
> }
>
>
>   
>> Hi!
>>
>> I assume you precompile the assambly and put it in bin.
>> In this case you sould put the name of the assembly in httpHandlers
>> section in web.config
>>
>> Let's say the assembly is named "fooAssembly.dll". In that case add:
>> <httpHandlers>
>>       <add verb="POST" path="Execute" type="NamespaceMyType,
>> fooAssembly"/>
>> </httpHandlers>
>>
>> If that doesn't help, please, post some code and the contents of
>> web.config.
>>
>> Cheers,
>> Michał Ziemski
>>
>> Nik Radford pisze:
>>     
>>> Hello all,
>>>
>>> I was wondering if someone could help me with this.
>>> I've written an ASP.NET website using visual studio 2005, and have
>>> written
>>> my own custom IHttpHandler. All works well, except when I move it over
>>> to
>>> my linux server and run it under mono.
>>>
>>> I get the error "(my http handler type) does not implement IHttpHandler
>>> or
>>> IHttpHandlerFactory"
>>>
>>> I then wrote a little program which I compiled under mono, to load the
>>> assembly my IHttpHandler type is in, and make sure that IHttpHandler
>>> could
>>> indeed be assigned from my type.
>>>
>>>     typeof(IHttpHandler).IsAssignableFrom(t);
>>>
>>> returned true.
>>>
>>> So I'm a little lost as to what is happening here.
>>>
>>> thanks in advance.
>>>
>>> Nik.
>>>
>>> ------------------------------------------
>>> E-Mail:    Nik at Terminaldischarge.net
>>> (We)Blog:  http://blog.terminaldischarge.net
>>>
>>> _______________________________________________
>>> Mono-devel-list mailing list
>>> Mono-devel-list at lists.ximian.com
>>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>>>
>>>       
>>     
>
>
> Nik.
>
> ------------------------------------------
> E-Mail:    Nik at Terminaldischarge.net
> (We)Blog:  http://blog.terminaldischarge.net
>
>   



More information about the Mono-devel-list mailing list