リフレクションを使用して、コントローラーに適用された属性に基づいてルートを生成する、ASP.NET MVC4 のカスタム ルーティング拡張機能に取り組んでいます。これは、 Brandon Byars の RestMvc プロジェクトのフォークであり、.NET 4.5 用に更新しています。
魅力は、次のように、独自のルートを記述するコントローラーを作成できることです。
public class EchoController : RestfulController
{
[Get("echo/{thingToEcho}.{format}", "echo/{thingToEcho}")]
public ActionResult Echo(string thingToEcho, string format)
{
if (format == "xml")
return new ContentResult
{
Content = string.Format("<echo>{0}</echo>", thingToEcho),
ContentType = MediaType.Xml
};
return new ContentResult
{
Content = thingToEcho,
ContentType = MediaType.PlainText
};
}
public override ActionResult Options(string resourceUri)
{
SetAllowHeader(resourceUri);
return new ContentResult {Content = "Options body goes here..."};
}
}
形式のルートで問題が発生しています
[Get("echo/{thingToEcho}.{format}", "echo/{thingToEcho}")]
GET /echo/test.xml
ここでの考え方は、上記の EchoController で示されているように、クライアントが次のような要求を行うことができ、コントローラーがプレーン テキストではなく xml 形式で応答を返すことができるということです。
eproject のフォークでは、すべてのルートが正しく生成されていますが、「echo/{thingToEcho}.{format}」ルートが機能せず、404 ページが表示されます。「.xml」を含まない同じリクエストは正しく機能し、予想されるテキストをエコー バックするため、ルート ハンドラが少なくとも部分的にその仕事をしているように見えます。
私はこれらのテクノロジーに少し慣れていませんが、これはweb.config
ファイルに登録されているハンドラーに関連している可能性があると思います。.NET 3.5 と MVC3 を対象とする Brandon の元のコードには、次のハンドラーがあります。
<handlers>
<remove name="WebServiceHandlerFactory-Integrated"/>
<remove name="MvcHttpHandler"/>
<remove name="UrlRoutingHandler"/>
<add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</handlers>
私のプロジェクトでは、これを MVC4 の基本的な Web アプリ テンプレートの上で機能させたかったので、新しい MVC4 プロジェクトを作成し、そこに Brandon のコントローラーをドロップしました。MVC4 web.config では、次のハンドラーが登録されています。
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
繰り返しますが、これらのハンドラーは追加していません。MVC4 プロジェクト テンプレートによって生成された既定値です。
これが私の問題の原因でしょうか? どうすればこれを解決できますか?