ASP.NET MVC 6 中的 MVC 控制器和 Web API 控制器有什么区别?

What is the difference between MVC Controller and Web API Controller in ASP.NET MVC 6?

In ASP.NET 5 MVC 6 Microsoft 将普通 MVC 控制器 class (Controller) 与 Web Api 控制器 class (ApiController).现在只有 Controller class 可以继承,其中也包括 WebApi 的功能。

所以现在区分MVC和WebApi控制器不是那么简单了。两者都继承自 Controller class。我能发现的唯一区别是 WebApi 的路由信息​​仍然由属性 HttpGetHttpPostHttpPutHttpDelete 提供。但是现在可以使用属性路由对 MVC 控制器执行相同的操作,只是使用不同的属性。

连功能似乎都融合了。 MVC 控制器现在也支持内容协商。

具体问题是:

是否还有真正的区别,还是只是指定路由的方式不同?现在哪种方式是创建网络应用程序的首选方式?

(几乎)空 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 方法中,因为默认情况下 return 类型仅为 JSON。

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

我觉得你想多了。

你的第一个问题"What is the difference of MVC Controller and Web API Controller in ASP.NET MVC 6?"假设它们是不同的,但它们不是。它们是合并的,所以没有区别。

如果你想定义单独的路由来封锁你的不return查看结果的操作方法,那就去做吧。如何组织您的应用程序取决于您。询问 "Which way is now the preferred one to create web apps?" 毫无意义,因为这取决于您的应用程序,并且在 MVC 6 投入生产使用很长一段时间之前,不会有更常见的做事方式。

虽然梅森完美地回答了这个问题,但我想提供一些关于差异的额外信息和一些资源,希望对未来的问题访问者有所帮助。

Microsoft 将 ApiControllerController 合并为一个 class、Controller。为此,他们删除了 ApiController 的一些功能。

This 是一个很棒的博客 post 描述了这些变化。

例如,不再将 HTTP Action 指定为参数方法的前缀和路由属性中的路由,现在都使用 HttpGetHttpPost 属性来完成。

[HttpGet("api/visits")]

如果您想从 WebApi 项目迁移,here 是一些指导。

如果您不想迁移,而只是想将项目转换为新的 ASP.NET MVC 版本,您可以使用 Web API Compatibility ShimHere and here 你会找到这方面的指导。