ASP.NET
ASP.NET_MVC
ASP.NET_WebAPI
ASP.NET_Core

ASP.NET Core MVC で HttpResponseMessage をそのまま HTTP レスポンスとして使う

More than 1 year has passed since last update.


やりたいこと

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 を追加すると、IMvcBuilderAddWebApiConventions() というメソッドが追加されるので、このメソッドを呼ぶ。

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 まで達しているが、言語仕様はアグレッシブに進化を続けているというのに、大きな本屋に行っても解説書がほとんどなく、とても残念。