Подтвердить что ты не робот

В чем разница между MVC Controller и Web API Controller в ASP.NET MVC 6?

В 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();
});
4b9b3361

Ответ 1

Я думаю, вы слишком много думаете об этом.

Ваш первый вопрос "В чем отличие MVC-контроллера и веб-API-контроллера в ASP.NET MVC 6?" предполагает, что они разные, но это не так. Они объединены, поэтому нет никакой разницы.

Если вы хотите определить отдельные маршруты, чтобы оцеплять свои методы действий, которые не возвращают результаты поиска, а затем перейдите к нему. Это зависит от вас, как организовать ваше приложение. Спросите, "Какой способ теперь предпочтительнее создавать веб-приложения?" бессмысленно, поскольку это зависит от вас, чтобы принять решение о вашем приложении, и не будет более распространенным способом делать что-либо до тех пор, пока MVC 6 не будет использоваться в течение длительного времени.

Ответ 2

В то время как каменщик ответил на вопрос отлично, я хочу предоставить дополнительную информацию о различиях и некоторых ресурсах, которые, надеюсь, помогут будущим посетителям вопроса.

Microsoft объединила ApiController и Controller в один класс, Controller. Для этого они удалили некоторые функции ApiController.

Это - отличное сообщение в блоге, описывающее изменения.

Например, вместо указания префикса HTTP Action в методе параметров и маршрута в атрибуте маршрута оба теперь выполняются с атрибутами HttpGet и HttpPost.

[HttpGet("api/visits")]

Если вы хотите перейти от проекта WebApi, здесь - это руководство для этого.

Если вы не хотите мигрировать, но просто хотите преобразовать проект в новую версию ASP.NET MVC, вы можете использовать Web API Compatibility Shim. Здесь и здесь вы найдете руководство для этого.