2011-11-16 12 views
5

Chciałbym użyć XSP lub lepszego mod_mono w .Net-Project przy użyciu metody IHttpHandler.Mono i IHttpHandler

Mam następujące klasy (dość prosta.

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); 
    } 
} 

i następujący 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> 

Jest doskonale działającymi w ramach IIS http://127.0.0.1/test/kfdlsa powroty 'Tak'

ciągu XSP lub mod_mono na Apache, mogę utworzyć index.aspx, który jest parsowany i wykonywany perfekcyjnie zgodnie z .Net-Framework, ale wygląda na to, że handler nie jest zawarte w ramach mod_mono-Framework.

Używa IHttpHandler naprawdę zaimplementowany w Mono lub należy użyć innego podejścia do zbierania wszystkich żądań do określonego hosta i/lub katalogu wirtualnego.

Odpowiedz

11

Procedury obsługi HTTP i moduły działają poprawnie w trybie Mono.

Twój problem polega na tym, że twój plik Web.config używa składni właściwej dla trybu "Integrated Pipeline" IIS. Ten tryb nie istnieje w Apache/mod_mono. Musisz więc użyć starej składni (czyli tej dla trybu "Klasyczny potok") i dodać sekcję <system.web/httpHandlers>, oprócz istniejącej sekcji <system.webServer/handlers>.

Zobacz ten Web.config przykład:

<?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> 

Znacznik <validation ...> jest bardzo ważne: jeśli go zapomnisz, IIS zgłasza błąd i skarży się, że nieupoważniona sekcja jest używana w kontekście Zintegrowany rurociągu.

Następnym krokiem jest zapoznanie się z serwerem Apache przenieść obsługę plików do mod_mono, tak:

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

Linia AddType application/x-asp-net .rss jest ważne. Zobacz relację między path="*.rss" w Web.config i .rss rozszerzenie w tym wierszu. Jeśli chcesz obsłużyć wszystkie rozszerzenia, tak jak w twoim przykładzie (path="*"), musisz zastąpić linię AddType application/x-asp-net .rss przez ForceType application/x-asp-net.

+0

Cedric, dziękuję za pomocną odpowiedź. Mam podobne pytanie dotyczące hostingu pojedynczego, obejmujące całe życie zmiennych statycznych, które podoba mi się Twój wkład na http://stackoverflow.com/questions/13480328/c-sharp-mono-linux-web-server-hosting- with-consistent -static-variables-across- – Glenn

+0

Działa doskonale! Dziękuję Ci. Używam XSP w trybie autonomicznym (nie mod_mono), więc konfiguracja Apache nie jest konieczna w tym scenariuszu, ale zmiany w pliku web.config są właśnie tym, co było potrzebne. –

+0

Jak uzyskać informacje o tym, co jest obsługiwane w pliku web.config dla Mono.WebServer? – DonDon