[英]Castle MonoRail Routing with IIS 7?
我正在尝试使路由模块使用默认操作或控制器,但事实并非如此。 我总是面对404页面找不到。 我忘记做某事吗? 我非常喜欢在ASP.NET MVC功能中进行路由,但我不确定我是否可以在MR中执行相同操作。 我正在使用IIS7与.NET 3.5的城堡主干的构建。
如果您使用的是IIS7,则需要在system.webServer / httpModules节点中注册路由模块。
system.web / httpHandlers和httpModules是IIS7忽略的AFAIK。
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
);
}
(第一个路由处理我们的应用程序root)
(这些值是我们的ThorController基类上的consts以尝试减少字符串文字)
顺便说一句,任何人都知道是否存在语法来执行我们在一行中执行静态文件处理的操作? 肯定有比我们的“解决方案”更好的方式;-)
你是如何配置路由的? 我在尝试从web.config管理路由规则时遇到了问题,但是在应用程序启动时将其移动到内联代码对我来说很有用。
我试图找到一个答案,为什么xml-way不起作用,但从未找到一个。 自RC3以来,他们对路由引擎进行了重大改写,可能已经打破了它。
Application_OnStart()中的示例
var rule = new PatternRoute( "default", "/" ) .DefaultForController().Is() .DefaultForAction().Is( "index" ); RoutingModuleEx.Engine.Add( rule );
请记住在web.config中的MonoRailHandler之前加载RoutingEngineModule。
我已经尝试注册这样的路由,但它仍然无法正常工作。
这是我的配置文件:
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.