使用IIS 7进行城堡MonoRail路由?

Vor*_*Chy 6 .net c# model-view-controller asp.net-mvc castle-monorail

我正在尝试使路由模块使用默认操作或控制器,但事实并非如此.我总是面对404页面找不到.我忘记做某事吗?我非常喜欢在ASP.NET MVC功能中进行路由,但我不确定我是否可以在MR中执行相同操作.我正在使用IIS7与.NET 3.5的城堡主干的构建.

Pet*_*nce 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>
Run Code Online (Sandbox Code Playgroud)

(事实上​​,我们从来没有在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
            );
    }
Run Code Online (Sandbox Code Playgroud)

(第一个路由处理我们的应用程序root)

(这些值是我们的ThorController基类上的consts以尝试减少字符串文字)

顺便说一句,任何人都知道是否存在语法来执行我们在一行中执行静态文件处理的操作?肯定有比我们的"解决方案"更好的方式;-)


jis*_*shi 1

你是如何配置路由的?当我尝试从 web.config 管理路由规则时,我自己遇到了问题,但将其移动到应用程序启动时的内联代码对我来说很有效。

我试图找到为什么 xml-way 不起作用的答案,但从未找到。自 RC3 以来,他们对路由引擎进行了重大重写,这可能会破坏它。

Application_OnStart() 中的示例

var 规则 = new PatternRoute( "默认", "/" )
    .DefaultForController().Is()
    .DefaultForAction().Is( "索引" );

RoutingModuleEx.Engine.Add(规则);

请记住在 web.config 中的 MonoRailHandler 之前加载 RoutingEngineModule。