ルーティング モジュールをデフォルト アクションまたはコントローラで動作させようとしていますが、動作しません。私は常に404ページが見つからないことに直面しています。私は何かをするのを忘れましたか?ASP.NET MVC 機能でのルーティングが本当に好きですが、MR で同じことができるかどうかはわかりません。.NET 3.5 の城トランクからのビルドで IIS7 を使用しています。
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 基本クラスの const です)
余談ですが、静的ファイル処理で行っていることを 1 行で行うための構文が存在するかどうか知っている人はいますか? 私たちの「解決策」よりも良い方法があるに違いありません ;-)
ルーティングをどのように構成していますか? web.config からルーティング ルールを管理しようとしたときに問題が発生しましたが、アプリケーションの開始時にインライン コードに移動するとうまくいきました。
xml-way が機能しない理由に対する答えを見つけようとしましたが、見つかりませんでした。彼らは、RC3 以降のルーティング エンジンを大幅に書き直しました。
Application_OnStart() の例
var rule = new PatternRoute( "default", "/" ) .DefaultForController().Is() .DefaultForAction().Is( "インデックス" ); RoutingModuleEx.Engine.Add(ルール);
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>