Замок MonoRail Маршрутизация с IIS 7? - PullRequest
6 голосов
/ 14 ноября 2008

Я пытаюсь заставить модуль маршрутизации работать с действием или контроллером по умолчанию, но это не так. Я всегда сталкиваюсь с 404 страницами не найденными. Я забыл что-то сделать? Мне действительно нравится маршрутизация в функции ASP.NET MVC, но я не уверен, что смог бы сделать то же самое в MR. Я использую IIS7 с билдом из ствола замка для .NET 3.5.

Ответы [ 3 ]

5 голосов
/ 12 декабря 2008

Если вы используете IIS7, вам нужна регистрация модуля маршрутизации в узле system.webServer / httpModules.

IIS7 игнорирует системные.web / httpHandlers и httpModules.

Маршрутизация MonoRail определенно работает; у нас это работает и работает счастливо. Вот конфиг и сниппеты global.asax.cs:

    <system.web>
    <authentication mode="None" />

    <compilation debug="true" />

    <!-- IIS6 / integrated dev server handler/module config -->
    <httpHandlers>
        <clear />
        <add path="favicon.ico" verb="*" type="System.Web.StaticFileHandler"/>
        <add path="Trace.axd" verb="*" type="System.Web.Handlers.TraceHandler"/>
        <add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" />
        <add path="*.spark" verb="*" type="System.Web.HttpForbiddenHandler" />
        <add path="*.sparkjs" verb="*" type="System.Web.HttpForbiddenHandler" />
        <add path="/content/**/*.*" verb="*" type="System.Web.StaticFileHandler" />
  <add path="/content/**/**/*.*" verb="*" type="System.Web.StaticFileHandler" />
  <add path="/content/**/**/**/*.*" verb="*" type="System.Web.StaticFileHandler" />
  <add path="/content/**/**/**/**/*.*" verb="*" type="System.Web.StaticFileHandler" />
  <add path="*" verb="*" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" />
        <add verb="*" path="*.castle" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework"/>
    </httpHandlers>

    <httpModules>
        <add name="routing" type="Castle.MonoRail.Framework.Routing.RoutingModuleEx, Castle.MonoRail.Framework" />
        <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.MicroKernel" />
    </httpModules>

    <trace enabled="true"/>

</system.web>

<!-- IIS 7 handler/module config -->
<system.webServer>
    <handlers>
        <clear />
        <add name="FavIcon" path="favicon.ico" verb="*" type="System.Web.StaticFileHandler"/>
        <add name="Trace" path="Trace.axd" verb="*" preCondition="integratedMode" type="System.Web.Handlers.TraceHandler"/>
        <add name="BlockConfig" path="*.config" verb="*" preCondition="integratedMode" type="System.Web.HttpForbiddenHandler" />
        <add name="BlockSpark" path="*.spark" verb="*" preCondition="integratedMode" type="System.Web.HttpForbiddenHandler" />
        <add name="BlockSparkJs" path="*.sparkjs" verb="*" preCondition="integratedMode" type="System.Web.HttpForbiddenHandler" />
        <add name="content" path="/content/**/*.*" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
        <add name="content2" path="/content/**/**/*.*" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
        <add name="content3" path="/content/**/**/**/*.*" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
        <add name="content4" path="/content/**/**/**/**/*.*" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
        <add name="castle" path="*" verb="*" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" modules="ManagedPipelineHandler" scriptProcessor="" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv2.0" />
    </handlers>

    <modules>
        <add name="routing" type="Castle.MonoRail.Framework.Routing.RoutingModuleEx, Castle.MonoRail.Framework" />
        <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.MicroKernel" />
    </modules>

    <validation validateIntegratedModeConfiguration="false" />

</system.webServer>

(На самом деле, мы никогда не работали на IIS6, но работали на сервере web-dev - с тех пор мы получили поддержку и сказали, что он будет работать с * сопоставлением на уровне IIS6 с aspnet_isapi.dll - но к тому времени разработчик, работающий под Win2003, обновился до чего-то с IIS7 на нем, поэтому мы не пробовали это)

        protected virtual void RegisterRoutes(IRoutingRuleContainer engine)
    {
        engine.Add
            (
            new PatternRoute(ThorController.CtlrHome, "/[controller]")
                .DefaultForController().Is(ThorController.CtlrHome)
                .DefaultForArea().Is(ThorController.AreaPublic)
                .DefaultForAction().Is(ThorController.ActionIndex)
            );

        engine.Add
            (
            new PatternRoute(ThorController.KeyDefault, "/<area>/<controller>/[action]/[id]")
                .DefaultForArea().Is(ThorController.AreaPublic)
                .DefaultForAction().Is(ThorController.ActionIndex)
                .DefaultFor(ThorController.KeyId).IsEmpty
            );
    }

(первый маршрут обрабатывает наш корень приложения)

(значения в нашем базовом классе ThorController являются константами, чтобы попытаться сократить строковые литералы)

Кроме того, кто-нибудь знает, существует ли синтаксис для выполнения того, что мы делаем со статической обработкой файлов в одну строку? Конечно, должен быть лучший способ, чем наше «решение»; -)

1 голос
/ 14 ноября 2008

Как вы настраиваете маршрутизацию? У меня были проблемы с самим собой, когда я пытался управлять правилами маршрутизации из web.config, но переход на встроенный код при запуске приложения работал для меня.

Я пытался найти ответ на вопрос, почему не работает xml-путь, но так и не нашел его. После RC3 они сделали основную переписку механизма маршрутизации, которая могла его сломать.

Пример из Application_OnStart ()


var rule = new PatternRoute( "default", "/" )
    .DefaultForController().Is()
    .DefaultForAction().Is( "index" );

RoutingModuleEx.Engine.Add( rule );

Не забудьте загрузить модуль RoutingEngineModule перед MonoRailHandler в web.config.

0 голосов
/ 17 ноября 2008

Я уже пытался зарегистрировать маршрутизацию, но это все равно не работает.

Вот мой файл конфигурации:

<system.web>
<httpHandlers>
  <add verb="*" path="*.rail" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" />
  <add verb="*" path="*.vm" type="System.Web.HttpForbiddenHandler" />
  <add verb="*" path="*.boo" type="System.Web.HttpForbiddenHandler" />
  <add verb="*" path="*.st" type="System.Web.HttpForbiddenHandler" />
</httpHandlers> 
<httpModules>
  <add name="routing" type="Castle.MonoRail.Framework.Routing.RoutingModuleEx, Castle.MonoRail.Framework" />
</httpModules></system.web> 
<system.webServer>
    <handlers>
        <add name="MR" path="*.rail" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
    </handlers>
</system.webServer>
...