Help us understand the problem. What is going on with this article?

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

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

TakahikoKawasaki
株式会社 Authlete の共同創業者。プログラマー兼代表取締役社長。
https://www.authlete.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away