【问题标题】:Castle MonoRail Routing with IIS 7?使用 IIS 7 的 Castle MonoRail 路由?
【发布时间】:2010-09-22 08:20:27
【问题描述】:

我正在尝试使路由模块与默认操作或控制器一起工作,但事实并非如此。我总是面对找不到 404 页面。我忘记做某事了吗?我真的很喜欢 ASP.NET MVC 功能中的路由,但我不确定我是否可以在 MR 中做同样的事情。我正在使用 IIS7 和 .NET 3.5 的城堡树干构建。

【问题讨论】:

    标签: c# .net asp.net-mvc model-view-controller castle-monorail


    【解决方案1】:

    如果你在IIS7上,你需要在system.webServer/httpModules节点中注册路由模块。

    IIS7 忽略了 system.web/httpHandlers 和 httpModules。

    MonoRail 路由绝对有效;我们已经启动并愉快地运行了。这里是 config 和 global.asax.cs sn-ps:

        <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 基类中的常量,以尝试减少字符串字面量)

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

    【讨论】:

      【解决方案2】:

      我已经尝试过像这样注册路由,但它仍然不起作用。

      这是我的配置文件:

      <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>
      

      【讨论】:

        【解决方案3】:

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

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

        Application_OnStart() 的示例

        var rule = new PatternRoute("default", "/") .DefaultForController().Is() .DefaultForAction().Is("index"); RoutingModuleEx.Engine.Add( 规则 );

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

        【讨论】:

          猜你喜欢
          • 2010-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-27
          • 2011-03-19
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多