[Mono-dev] Problems with IHttpHandler
Nik Radford
nik at terminaldischarge.net
Fri Feb 22 10:56:58 EST 2008
I've discovered what makes it error, though not why.
As soon as I add a field (private field in this case) whatever handles the
HttpHandlers stop recognizing the custom handler as a valid IHttpHandler.
This is obviously incorrect, as other mono code (my program I mentioned)
does recognize it, and so does .NET
I'll get a test case together and a bug reported shortly.
> Yes. I added
> MonoServerPath /usr/local/bin/mod-mono-server2
>
> to the mod_mono.conf file before attempting this.
>
> However, I've just been trying to create the test case, by creating a test
> site and dll, and don't seem to be able to replicate the error. So now I'm
> even more confused.
>
>
>> 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
>>>
>>>
>>
>>
>
>
> Nik.
>
> ------------------------------------------
> E-Mail: Nik at Terminaldischarge.net
> (We)Blog: http://blog.terminaldischarge.net
>
>
Nik.
------------------------------------------
E-Mail: Nik at Terminaldischarge.net
(We)Blog: http://blog.terminaldischarge.net
More information about the Mono-devel-list
mailing list