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,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");
}
}
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长时间投入生产之前,不会有更常见的做事方式.
虽然梅森完美地回答了这个问题,但我想提供一些关于差异和一些资源的额外信息,这些信息有望帮助未来的访问者解决问题.
微软合并ApiController,并Controller为一类,Controller.为了做到这一点,他们删除了一些功能ApiController.
这是一篇很好的博客文章,描述了这些变化.
例如,不是HTTP Action在路由属性中指定参数方法和路由的as前缀,而是使用HttpGet和HttpPost属性完成两者.
[HttpGet("api/visits")]
Run Code Online (Sandbox Code Playgroud)
如果您想从WebApi项目迁移,这里有一些指导.
如果您不想迁移,只想将项目转换为新ASP.NET MVC版本,则可以使用Web API Compatibility Shim.在这里和这里你可以找到指导.