Próbuję sprawić, aby moduł routingu działał z domyślną akcją lub kontrolerem, ale tak się nie dzieje. Zawsze spotykam się z 404 stronami nie znalezionymi. Czy zapomniałem coś zrobić? Naprawdę lubię routing w funkcji ASP.NET MVC, ale nie jestem pewien, czy mógłbym zrobić to samo w MR. Używam IIS7 z budową z pnia zamka dla .NET 3.5.Routing w Castle MonoRail z usługą IIS 7?
Odpowiedz
Jak konfigurujesz routing? Miałem problemy podczas próby zarządzania regułami routingu z web.config, ale przeniesienie go do kodu inline przy uruchamianiu aplikacji działało dla mnie.
Próbowałem znaleźć odpowiedź na pytanie, dlaczego xml-way nie działa, ale nigdy nie znalazł. Zrobili poważną przeróbkę silnika rutującego od czasu RC3, który mógł go złamać.
przykład z Application_OnStart()
var rule = new PatternRoute("default", "/") .DefaultForController().Is() .DefaultForAction().Is("index"); RoutingModuleEx.Engine.Add(rule);
pamiętać, aby załadować RoutingEngineModule przed MonoRailHandler w web.config.
Próbowałem już zarejestrować taką trasę, ale nadal nie działa.
Oto mój plik konfiguracyjny:
<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>
Jeśli jesteś na IIS7, musisz rejestrację modułu routingu w system.webServer/httpModules węzła.
System.web/httpHandlers i httpModules są AFAIK ignorowane przez IIS7.
Trasowanie MonoRail na pewno działa; mamy go i biegniemy szczęśliwie. Here're config i Global.asax.cs rozszerzone:
<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>
(W rzeczywistości, nigdy nie dostaliśmy tej pracy na IIS6, ale nie na serwerze web-dev - mamy wsparcie od tamtego czasu i kazano będzie pracować z mapowaniem * na poziomie IIS6 do aspnet_isapi.dll - ale wtedy, dev uruchomiony Win2003 zaktualizowana coś z IIS7 na nim, więc nie próbowałem tego)
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
);
}
(pierwsza trasa obsługuje naszą aplikację root)
(wartości są consts na naszej klasie bazowej ThorController, aby spróbować wyciąć literały ciągów znaków)
Odkładając na bok, każdy może wiedzieć, czy istnieje składnia, aby zrobić to, co robimy ze statyczną obsługą plików w jednym wierszu? Na pewno musi być lepsza droga niż nasze "rozwiązanie" ;-)