В ASP.NET 5 MVC 6 Microsoft объединил обычный класс контроллера MVC (Controller
) с классом контроллера Web Api (ApiController
). Теперь наследуется только класс Controller
, который также включает в себя функции WebApi.
Итак, теперь не так просто отличить контроллеры MVC и WebApi. Оба наследуются от класса Controller
. Единственное различие, которое я могу заметить, заключается в том, что информация о маршрутизации 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)
{
}
}
EDIT:
Если вы хотите попробовать, если согласование содержимого работает, вы должны включить этот код в свой метод Startup.ConfigureServices, потому что по умолчанию тип возвращаемого значения - только JSON.
services.Configure<MvcOptions>(options =>
{
options.AddXmlDataContractSerializerFormatter();
});