我正在尝试使路由模块与默认操作或控制器一起使用,但事实并非如此。我总是面对找不到 404 页面。我忘记做某事了吗?我真的很喜欢 ASP.NET MVC 特性中的路由,但我不确定我是否可以在 MR 中做同样的事情。我正在使用 IIS7 和 .NET 3.5 的城堡树干构建。
3 回答
如果您使用的是 IIS7,则需要在 system.webServer/httpModules 节点中注册路由模块。
system.web/httpHandlers 和 httpModules 被 IIS7 忽略。
MonoRail 路由绝对有效;我们已经启动并愉快地运行了。这是 config 和 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 基类中的常量,以尝试减少字符串文字)
顺便说一句,任何人都知道是否存在语法来完成我们在一行中处理静态文件的操作?肯定有比我们的“解决方案”更好的方法;-)
你是如何配置路由的?在尝试从 web.config 管理路由规则时,我自己遇到了问题,但是将其移动到 application-start 上的内联代码对我有用。
我试图找到为什么 xml 方式不起作用的答案,但从未找到答案。自 RC3 以来,他们对路由引擎进行了重大重写,这可能会破坏它。
来自 Application_OnStart() 的示例
var rule = new PatternRoute("default", "/") .DefaultForController().Is() .DefaultForAction().Is("index"); RoutingModuleEx.Engine.Add( 规则 );
请记住在 web.config 中的 MonoRailHandler 之前加载 RoutingEngineModule。
I've tried to register routing like this already but it still doesn't work.
Here is my configuration file:
<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>