Моно и IHttpHandler

Я хотел бы использовать XSP или лучше mod_mono в .Net-Project, используя метод IHttpHandler.

У меня есть следующий класс (довольно простой:

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

И следующий 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>

Он отлично работает в IIS. http://127.0.0.1/test/kfdlsa возвращает "Да"

В XSP или mod_mono на Apache я могу создать index.aspx, который анализируется и выполняется в соответствии с .Net-Framework, но похоже, что обработчик не включен в mod_mono-Framework.

Действительно ли IHttpHandler реализован в Mono, или мне следует использовать другой подход для сбора всех запросов к определенному хосту и/или виртуальному каталогу.


person UllaDieTrulla    schedule 16.11.2011    source источник


Ответы (1)


Обработчики и модули HTTP отлично работают в Mono.

Ваша проблема в том, что ваш файл Web.config использует синтаксис, характерный для режима IIS «Интегрированный конвейер». Этот режим не существует в Apache/mod_mono. Таким образом, вы должны использовать старый синтаксис (то есть тот, который используется в режиме «Классический конвейер») и предоставить раздел <system.web/httpHandlers> в дополнение к существующему разделу <system.webServer/handlers>.

См. этот Web.config пример:

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

Тег <validation ...> очень важен: если его забыть, IIS выдает ошибку и жалуется, что в контексте Integrated Pipeline используется неавторизованный раздел.

Следующим шагом является указание серверу Apache передать обработку ваших файлов mod_mono, например:

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

Строка AddType application/x-asp-net .rss является важной. См. связь между path="*.rss" в Web.config и расширением .rss в этой строке. Если вы хотите обрабатывать все расширения, как в вашем примере (path="*"), вы должны заменить строку AddType application/x-asp-net .rss на ForceType application/x-asp-net.

person CedX    schedule 13.01.2012
comment
Седрик, спасибо за полезный ответ. У меня есть аналогичный вопрос о моно веб-хостинге, связанный со временем жизни статических переменных, и мне бы хотелось, чтобы вы ответили на stackoverflow.com/questions/13480328/ - person Glenn; 21.11.2012
comment
Работает отлично! Спасибо. Я использую XSP в автономном (не mod_mono) режиме, поэтому в этом сценарии конфигурация apache не требуется, но изменения web.config — это то, что было необходимо. - person Ole Tolshave; 18.03.2014
comment
Как вы получаете информацию о том, что поддерживается или нет в web.config для Mono.WebServer? - person DonDon; 20.01.2015