web-dev-qa-db-ja.com

ASP.NET MVC 6のMVCコントローラーとWeb APIコントローラーの違いは何ですか?

ASP.NET 5 MVC 6では、Microsoftは通常のMVCコントローラークラス(Controller)とWeb Apiコントローラークラス(ApiController)をマージしました。これで、継承するControllerクラスだけが存在し、WebApiの機能も含まれています。

したがって、MVCコントローラーとWebApiコントローラーを区別するのはそれほど簡単ではありません。両方ともControllerクラスから継承します。見つけられる唯一の違いは、WebApiのルーティング情報が属性HttpGetHttpPostHttpPut、およびHttpDeleteによって提供されることです。しかし、異なる属性を使用するだけで、属性ルーティングを使用してMVCコントローラーでも同じことが可能になりました。

機能も統合されたようです。 MVCコントローラーは、コンテンツネゴシエーションもサポートするようになりました。

具体的な質問は次のとおりです。

まだ本当の違いがありますか、それともルートの指定方法だけですか? Webアプリを作成するために、現在どの方法が推奨されていますか?

(ほぼ)空のMVCコントローラー:

public class HomeController : Controller
{
    public List<Person> Index()
    {
        return new List<Person>()
        {
            new Person() {Firstname = "test1", Lastname = "test2"},
            new Person() {Firstname = "test3", Lastname = "test4"}
        };
    }

    public IActionResult About()
    {
        ViewData["Message"] = "Your application description page.";

        return View();
    }

    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";

        return View();
    }

    public IActionResult Error()
    {
        return View("~/Views/Shared/Error.cshtml");
    }
}

(ほぼ)空のWebApiコントローラー:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET: api/values
    [HttpGet]
    public IEnumerable<Person> Get()
    {
        return new List<Person>()
        {
            new Person() {Firstname = "test1", Lastname = "test2"},
            new Person() {Firstname = "test3", Lastname = "test4"}
        };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
    }
}

編集:

コンテンツネゴシエーションが機能するかどうか試してみたい場合は、このコードをStartup.ConfigureServicesメソッドに含める必要があります。これは、デフォルトでは戻り値のタイプがJSONのみであるためです。

services.Configure<MvcOptions>(options =>
{
    options.AddXmlDataContractSerializerFormatter();
});
27
Domysee

あなたはこれについて考えすぎていると思います。

最初の質問「ASP.NET MVC 6のMVCコントローラーとWeb APIコントローラーの違いは何ですか?」それらは異なると仮定しますが、そうではありません。それらはマージされるので、違いはありません。

ビューの結果を返さないアクションメソッドを保護するために別のルートを定義する場合は、それを実行します。アプリケーションの整理方法はあなた次第です。 「現在、Webアプリの作成に適した方法はどれですか?」それはあなたのアプリケーションのために決めるのはあなた次第であり、MVC 6がかなりの期間本番で使用されるまで物事を行うより一般的な方法はないので、無意味です。

23
mason

メイソンは質問に完全に答えましたが、違いについての追加情報と、質問の将来の訪問者に役立つと思われるリソースを提供したいと思います。

MicrosoftはApiControllerControllerを1つのクラスControllerにマージしました。それを行うために、彼らはApiControllerのいくつかの機能を削除しました。

This は、変更点を説明する素晴らしいブログ投稿です。

たとえば、HTTP Actionをrouteメソッドのパラメーターメソッドとルートのプレフィックスとして指定する代わりに、両方ともHttpGetおよびHttpPost属性を使用して行われます。

[HttpGet("api/visits")]

WebApiプロジェクトから移行する場合、 here がそのためのガイダンスです。

移行したくないが、プロジェクトを新しいASP.NET MVCバージョンに変換するだけの場合は、Web API Compatibility Shimを使用できます。 ここ および ここ のガイダンスがあります。

9
Domysee