2011-11-16 9 views
5

Me gustaría usar XSP o mejor mod_mono dentro de un .Net-Project usando el método IHttpHandler.Mono y IHttpHandler

que tienen la siguiente clase (bastante simple:.

public class Class1 : IHttpHandler 
{ 
    public bool IsReusable 
    { 
     get { return false; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     var result = "<h1>Yeah</h1>"; 
     var bytes = Encoding.UTF8.GetBytes(result); 

     context.Response.Write(result); 
    } 
} 

Y la siguiente web.config

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <handlers accessPolicy="Read, Execute, Script"> 
      <add name="Class" path="*" verb="*" type="IISHost.Class1" resourceType="Unspecified" preCondition="integratedMode" /> 
     </handlers> 
    </system.webServer> 
    <system.web> 
     <compilation defaultLanguage="c#" /> 
    </system.web> 
</configuration> 

Está funcionando perfectamente dentro de IIS http://127.0.0.1/test/kfdlsa devuelve 'Sí'

Dentro XSP o mod_mono en Apache, puedo crear un index.aspx que se analiza y ejecuta perfectamente de acuerdo con .Net-Framework, pero parece ser que el controlador no es incluido dentro del mod_mono-Framework.

Está utilizando IHttpHandler realmente implementado dentro de Mono o debo usar otro enfoque para la recopilación de todas las solicitudes a un determinado host y/o directorio virtual.

Respuesta

11

Los controladores y módulos HTTP funcionan bien en Mono.

Su problema es que su archivo Web.config usa la sintaxis específica del modo "Integrated Pipeline" de IIS. Este modo no existe en Apache/mod_mono. Por lo tanto, debe usar la sintaxis anterior (es decir, la del modo "Canalización clásica") y proporcionar una sección <system.web/httpHandlers>, además de la sección existente <system.webServer/handlers>.

ver este Web.config ejemplo:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
     <httpHandlers> 
      <add path="*.rss" verb="*" type="CedricBelin.Web.FeedHandler" /> 
     </httpHandlers> 
    </system.web> 

    <system.webServer> 
     <handlers> 
      <add name="Feed" path="*.rss" verb="*" type="CedricBelin.Web.FeedHandler" /> 
     </handlers> 

     <validation validateIntegratedModeConfiguration="false" /> 
    </system.webServer> 
</configuration> 

La etiqueta <validation ...> es muy importante: en caso de olvido, IIS genera un error y se queja de que una sección no autorizada se utiliza en el contexto canalización integrada.

El siguiente paso es hacer que el servidor Apache para transferir el manejo de los archivos a Mod_Mono, así:

<VirtualHost *:80> 
    ServerName mono.localhost 
    DocumentRoot "/Library/WebServer/Documents/MonoTest" 
    AddType application/x-asp-net .rss 
</VirtualHost> 

La línea AddType application/x-asp-net .rss es el importante. Consulte la relación entre path="*.rss" en Web.config y .rss extensión en esta línea. Si desea manejar todas las extensiones, como en su ejemplo (path="*"), debe reemplazar la línea AddType application/x-asp-net .rss por ForceType application/x-asp-net.

+0

Cedric, gracias por su útil respuesta. Tengo una pregunta de alojamiento web mono similar que involucra la vida útil de las variables estáticas que me encantaría su entrada en http://stackoverflow.com/questions/13480328/c-sharp-mono-linux-web-server-hosting-with-consistent -static-variables-across – Glenn

+0

¡Funciona a la perfección! Gracias. Estoy usando XSP en modo independiente (no mod_mono), por lo que la configuración de apache no es necesaria en ese escenario, pero los cambios de web.config son justo lo que se necesitaba. –

+0

¿Cómo se obtiene la información que admite o no en web.config para Mono.WebServer? – DonDon