ASP.NET MVC Controller API & Web API Controller

2023-03-08

筆記 ASP.NET MVC Controller API 以及 Web API Controller 的差別與應用時機。

logo

說明

the difference between ASP.NET MVC Controller API and Web API Controller
ChatGPT Prompt

ASP.NET MVC Controller API 和 ASP.NET Web API Controller 都是用於建立 Web Application應用程式的 Controller,主要差別如下:

使用目的

ASP.NET MVC Controller API 旨在支援 MVC(Model-View-Controller)架構,用於創建具有多個檢視和操作的 Web Application。而 ASP.NET Web API Controller 則專注於提供 RESTful Web API 服務。

回傳型別

ASP.NET MVC Controller API的Return Type 可以是 ViewResult, PartialViewResult 或 JsonResult等,用於回傳HTML或JSON格式的資料給客戶端;ASP.NET Web API Controller 的Return Type 通常是IHttpActionResult,它是一個抽象介面,它可根據需要返回各種不同的HTTP回應,例如Ok,BadRequest或NotFound。

Content Negotiation

路由機制

ASP.NET MVC Controller API使用[Route]屬性來定義控制器和操作方法的路由,而ASP.NET Web API Controller使用[RoutePrefix]和[Route]屬性來定義Web API的路由。

使用時機

ASP.NET MVC Controller API 通常提供用戶端與伺服器之間的互動,例如HTML表單提交和頁面重新整理;ASP.NET Web API Controller 則通常提供用戶端使用HTTP請求與伺服器之間的互動,例如GET,POST,PUT和DELETE等。

Sample Code

Controller API

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public IActionResult SubmitForm(string name, int age)
    {
        // Process form data and return a result
        return View("Success");
    }
}

Web API Controller

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
    private readonly IUserService _userService;

    public UsersController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpGet]
    public IActionResult GetUsers()
    {
        var users = _userService.GetUsers();
        return Ok(users);
    }

    [HttpPost]
    public IActionResult AddUser(UserDto userDto)
    {
        var user = _userService.AddUser(userDto);
        return CreatedAtAction(nameof(GetUserById), new { id = user.Id }, user);
    }

    [HttpGet("{id}")]
    public IActionResult GetUserById(int id)
    {
        var user = _userService.GetUserById(id);
        if (user == null)
        {
            return NotFound();
        }
        return Ok(user);
    }
}