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

Dom*_*see 27 c# asp.net asp.net-mvc asp.net-core-mvc asp.net-core

在ASP.NET 5 MVC 6中,Microsoft将普通的MVC控制器类(Controller)与Web Api控制器类(ApiController)合并.现在只有一个Controller继承的类,其中包括WebApi的功能.

所以现在区分MVC和WebApi控制器并不是那么简单.两者都继承自Controller班级.我能发现的唯一的区别是的WebAPI的路由信息仍然由属性提供HttpGet,HttpPost,HttpPutHttpDelete.但现在可以使用属性路由对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");
    }
}
Run Code Online (Sandbox Code Playgroud)

(差不多)空的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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

If you want to try if content negotiation works, you have to include this code into your Startup.ConfigureServices method, because per default the return type is JSON only.

services.Configure<MvcOptions>(options =>
{
    options.AddXmlDataContractSerializerFormatter();
});
Run Code Online (Sandbox Code Playgroud)

mas*_*son 23

我想你太过于考虑这件事了.

您的第一个问题"ASP.NET MVC 6中MVC控制器和Web API控制器的区别是什么?" 预先假定它们是不同的,但它们不是.它们被合并,所以没有区别.

如果要定义单独的路由以封锁不返回View结果的操作方法,请继续操作.由您决定如何组织您的应用程序.问"现在哪种方式是创建网络应用程序的首选方式?" 这是没有意义的,因为由您来决定您的应用程序,并且在MVC 6长时间投入生产之前,不会有更常见的做事方式.


Dom*_*see 9

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

微软合并ApiController,并Controller为一类,Controller.为了做到这一点,他们删除了一些功能ApiController.

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

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

[HttpGet("api/visits")]
Run Code Online (Sandbox Code Playgroud)

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

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