やりたいこと
ASP.NET Web API では HttpResponseMessage
インスタンスを HTTP レスポンスとして扱ってくれるのに、ASP.NET MVC 6 以降は HttpResponseMessage
インスタンスそのものを JSON に変換してしまう。そんな動作は誰も望んでいない・・・。
新しい ASP.NET Core MVC を使いながらも HttpResponseMessage
をそのまま HTTP レスポンスとして扱ってもらいたい。
WebApiCompatShim
既存の ASP.NET Web API による実装を ASP.NET Core MVC へ移行する作業を簡単にするため、WebApiCompatShim なるものが用意されている。NuGet Gallery で Microsoft.AspNetCore.Mvc.WebApiCompatShim
を検索してプロジェクトに追加する。
AddWebApiConventions()
WebApiCompatShim を追加すると、IMvcBuilder
に AddWebApiConventions()
というメソッドが追加されるので、このメソッドを呼ぶ。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddWebApiConventions();
}
......
Web API の実装
これで、Web API の実装から返す HttpResponseMessage
インスタンスを HTTP レスポンスとして使ってもらえる。
[Route("api/[controller]")]
public class ValuesController : Controller
{
[HttpGet]
public HttpResponseMessage Get()
{
......
}
async
/ await
と一緒に使っても動くことは簡単な例で確認済み。
[HttpGet]
public async Task<HttpResponseMessage> Get()
{
return await ......
}
感想
ASP.NET で Web API 開発の情報を探そうとして検索すると、IHttpActionResult
云々の記事が多く出てくるが、これは ASP.NET Web API でのやり方なので、今となっては古い。ASP.NET Core MVC では代わりに IActionResult
を使う。検索して古い情報がたくさん出てくるのは残念。
それにしても、ほぼマイクロソフト陣営単体でやっているだろうに、何故こうも .NET は API の分岐・統廃合・再設計を繰り返すのだろうか。 "ASP.NET 5 is dead – Introducing ASP.NET Core 1.0 and .NET Core 1.0" (January 19, 2016) や ".NET Standard Versions" といった状況は、マイクロソフトの技術に不慣れな技術者にとっては辛い。
ついでにいうと、C# のバージョンは現時点でバージョン 7.0 まで達しているが、言語仕様はアグレッシブに進化を続けているというのに、大きな本屋に行っても解説書がほとんどなく、とても残念。