Я пытаюсь сделать модуль маршрутизации работает с действием по умолчанию или контроллером, но это не так. Я всегда сталкиваюсь с 404 страницей, которая не найдена. Забыл ли я что-нибудь сделать? Мне очень нравится маршрутизация в ASP.NET MVC, но я не уверен, что смогу сделать то же самое в MR. Я использую IIS7 со сборкой из ствола замка для .NET 3.5.Замок MonoRail Маршрутизация с помощью IIS 7?
ответ
Как вы настраиваете маршрутизацию? У меня возникли проблемы при попытке управлять правилами маршрутизации из web.config, но переключение на встроенный код на приложении-start работало для меня.
Я попытался найти ответ на вопрос, почему xml-путь не работал, но так и не нашел. Они сделали большой передел двигателя маршрутизации с RC3, который мог сломать его.
Пример из Application_OnStart()
var rule = new PatternRoute("default", "/") .DefaultForController().Is() .DefaultForAction().Is("index"); RoutingModuleEx.Engine.Add(rule);
Запомнить загрузить RoutingEngineModule перед MonoRailHandler в web.config.
Я уже пытался зарегистрировать маршрутизацию, но это все еще не работает.
Вот мой конфигурационный файл:
<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>
Если вы на IIS7, вам нужен модуль регистрации маршрутизации в system.webServer/HttpModules узла.
System.web/httpHandlers и httpModules - AFAIK игнорируются IIS7.
MonoRail routing определенно работает; мы работаем счастливо. Here're конфигурации и 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, но сделал на сервере веб-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, чтобы попробовать для сокращения строковых литералов)
В любом случае, кто-нибудь знает, существует ли синтаксис для выполнения того, что мы делаем со статической обработкой файлов в одной строке? Разумеется, это должно быть лучше, чем наше «решение» ;-)