前回の投稿で、ASP.NET Web API (.NET Core ではなく) において、バイナリコンテンツを返すにはどう実装するのかについてまとめた。
たかだかバイナリコンテンツを返すだけなのに、決して少ないとは言えない量のコードを記述する必要があることがわかり、もやっとする印象であった。
ASP.NET Core での実装はどうなる?
さてところで、ASP.NET Core における Web API からバイナリコンテンツを返す場合はどうなるか。
ASP.NET Core からは、ASP.NET MVC と ASP.NET Web API は、その実装が統一化された。
旧来の ASP.NET では、MVC のコントローラクラス (System.Web.Mvc.Controller) と、Web API のコントローラクラス (System.Web.Http.ApiController) とは別物であった。
しかし ASP.NET Core MVC からは両者は統一され、MVC コントローラと API コントローラで区別がなくなり、いずれも同じ Microsoft.AspNetCore.Mvc.Controller クラスからの派生となる。
その結果、バイナリコンテンツの返し方は、旧来の ASP.NET MVC と同じ、File() メソッド呼び出しを返すだけでよくなった!
[Rout("api")]
public class MyController : Controller
{
// 戻り値は IActionResult とする。
[HttpGet, Route("picture")]
public IActionResult Get()
{
// MVC/Web API の区別なく、File メソッド使うだけで
// 容易にバイナリコンテンツを返すことができる!
var bytes = new byte[] { /* バイナリコンテンツのバイト列 */ };
return this.File(bytes, "application/octet-stream");
}
// もちろん従来どおり、任意の型の戻り値を返すことができ、
// ブラウザには JSON に書式化して届く。
// HTTP GET /api/values => [1, 2, 3]
[HttpGet, Route("values")]
public int[] GetValues()
{
return new []{ 1, 2, 3 };
}
}
まとめ
ASP.NET Core ならとてもシンプルである。
これならはじめから ASP.NET Core で実装しておけばよかったと反省である。