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 的路由信息仍然由属性 HttpGet
、HttpPost
、HttpPut
和 HttpDelete
提供。但是现在可以使用属性路由对 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 将 ApiController
和 Controller
合并为一个 class、Controller
。为此,他们删除了 ApiController
的一些功能。
This 是一个很棒的博客 post 描述了这些变化。
例如,不再将 HTTP Action
指定为参数方法的前缀和路由属性中的路由,现在都使用 HttpGet
和 HttpPost
属性来完成。
[HttpGet("api/visits")]
如果您想从 WebApi
项目迁移,here 是一些指导。
如果您不想迁移,而只是想将项目转换为新的 ASP.NET MVC
版本,您可以使用 Web API Compatibility Shim
。 Here and here 你会找到这方面的指导。
In ASP.NET 5 MVC 6 Microsoft 将普通 MVC 控制器 class (Controller
) 与 Web Api 控制器 class (ApiController
).现在只有 Controller
class 可以继承,其中也包括 WebApi 的功能。
所以现在区分MVC和WebApi控制器不是那么简单了。两者都继承自 Controller
class。我能发现的唯一区别是 WebApi 的路由信息仍然由属性 HttpGet
、HttpPost
、HttpPut
和 HttpDelete
提供。但是现在可以使用属性路由对 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 将 ApiController
和 Controller
合并为一个 class、Controller
。为此,他们删除了 ApiController
的一些功能。
This 是一个很棒的博客 post 描述了这些变化。
例如,不再将 HTTP Action
指定为参数方法的前缀和路由属性中的路由,现在都使用 HttpGet
和 HttpPost
属性来完成。
[HttpGet("api/visits")]
如果您想从 WebApi
项目迁移,here 是一些指导。
如果您不想迁移,而只是想将项目转换为新的 ASP.NET MVC
版本,您可以使用 Web API Compatibility Shim
。 Here and here 你会找到这方面的指导。