Mono и IHttpHandler - PullRequest
       25

Mono и IHttpHandler

5 голосов
/ 17 ноября 2011

Я бы хотел использовать 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, или я должен использовать другой подход для сбора всех запросов к определенному хосту и / или виртуальному каталогу.

1 Ответ

11 голосов
/ 13 января 2012

Обработчики 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.

...