静的コンテンツへの要求を動的に処理する

前回の静的コンテンツにも SSL を強制するという投稿に関連して、Web アプリケーションにおいて
.txt などの静的ファイルの拡張子を持った HTTP 要求を動的に処理する方法について書きます。

これを実現するには、特定の拡張子に対する HTTP ハンドラーを新たに実装してもよいのですが、
ASP.NET MVC のルーティングを使って、特定の拡張子に対するアクションを手軽に実装できます。

拡張子 .txt の付いた HTTP 要求に対するアクション メソッドを、次のように属性ルーティングを使って実装します。


using System;
using System.Web;
using System.Web.Mvc;

namespace HandlersMvc.Controllers
{
    [RoutePrefix("Text")]
    [Route("{action=Index}")]
    public class TextController : Controller
    {
        public ActionResult Index()
        {
            return View();
        } 

        [Route("{name}.txt")]
        public ActionResult GetFile(string name)
        {
            var text = string.Format("The file name is {0}.", name);
            return Content(text, "text/plain");
        }
    }
}


 

属性ルーティングを有効にするために、RouteConfig.cs で MapMvcAttributeRoutes メソッドを呼び出します。


using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace HandlersMvc
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapMvcAttributeRoutes();

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}


 

しかし、これだけでは動作しません。

静的コンテンツの拡張子

 

これは前回の静的コンテンツにも SSL を強制するの投稿で説明した通り、
静的コンテンツの拡張子に対する HTTP 要求は IIS 側で処理されるためです。
そこで、Web.config で特定の拡張子に対する HTTP ハンドラーの指定を追加します。


<configuration>
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
      <add name="Custom-TextHandler" path="*.txt" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
</configuration>


 

これで、静的コンテンツの拡張子に対しても動的に処理できるようになりました。

静的コンテンツの拡張子

 

なお、前回のような SSL の強制と今回のような ASP.NET MVC での動的処理を組み合わせたい場合、
Web.config では前回と同様の記述で、次の 2 つを指定すれば動作するようです。

path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler"
path="*" verb="*" type="System.Web.StaticFileHandler"

 

バージョン情報
.NET Framework 4.5
ASP.NET MVC 5

参照
ハンドラー <handlers> (TechNet)
静的コンテンツにも SSL を強制する

カテゴリー: .NET Framework. タグ: . 1 Comment »

コメント / トラックバック1件 to “静的コンテンツへの要求を動的に処理する”

  1. 静的コンテンツにも SSL を強制する | Do Design Space Says:

    […] 参照 HTTPS および SSL による Windows Azure Web サイト (WAWS) のセキュリティ保護 Windows Azure Web サイトで SSL を強制する 静的コンテンツへの要求を動的に処理する […]


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。