ASP.NET MVC 6中MVC Controller和Web API Controller有什么区别?

在ASP.NET 5 MVC 6中,Microsoft将普通的MVC控制器类( Controller )与Web Api控制器类( ApiControllerApiController 。 现在只有一个inheritance的Controller类,其中也包含了WebApi的function。

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

甚至这些function似乎已合并。 MVC控制器现在也支持内容协商。

具体问题是:

是否仍然存在真正的差异,还是只是指定路线的方式? 现在哪种方式是创建网络应用程序的首选方式?

(差不多)空的MVC控制器:

 public class HomeController : Controller { public List Index() { return new List() { 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 Get() { return new List() { 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(options => { options.AddXmlDataContractSerializerFormatter(); }); 

我想你太在想这个了。

您的第一个问题“ASP.NET MVC 6中MVC控制器和Web API控制器的区别是什么?” 预设他们是不同的,但事实并非如此。 它们被合并,所以没有区别。

如果要定义单独的路由以封锁不返回View结果的操作方法,请继续操作。 由您决定如何组织您的应用程序。 问“现在哪种方式是创建网络应用程序的首选方式?” 没有意义,因为由你来决定你的应用程序,直到MVC 6在生产中使用了很长一段时间之后才会有更常见的做法。

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

Microsoft将ApiControllerController合并为一个类Controller 。 为了做到这一点,他们删除了ApiController一些function。

这是一篇很好的博客文章,描述了这些变化。

例如,不是将HTTP Action指定为参数方法的前缀和路由属性中的路由,而是使用HttpGetHttpPost属性完成两者。

 [HttpGet("api/visits")] 

如果您想从WebApi项目迁移, 这里有一些指导。

如果您不想迁移,只是想将项目转换为新的ASP.NET MVC版本,则可以使用Web API Compatibility Shim 。 在这里和这里你可以找到指导。