前回の静的コンテンツにも 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"
前回:静的コンテンツにも SSL を強制する
次回:ASP.NET で HTTP ハンドラーを作成する
作成したサンプル
HandlersMvc (GitHub)
バージョン情報
.NET Framework 4.5
ASP.NET MVC 5