[英]Making a controller not visible to the client in ASP.NET WEB API (or MVC)
[英]What is the difference between MVC Controller and Web API Controller in ASP.NET MVC 6?
在ASP.NET 5 MVC 6中,Microsoft將普通的MVC控制器類( Controller
)與Web Api控制器類( ApiController
) 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)
{
}
}
編輯:
如果要嘗試內容協商,則必須將此代碼包含在Startup.ConfigureServices方法中,因為默認情況下返回類型僅為JSON。
services.Configure<MvcOptions>(options =>
{
options.AddXmlDataContractSerializerFormatter();
});
我想你太過於考慮這件事了。
您的第一個問題“ASP.NET MVC 6中MVC控制器和Web API控制器的區別是什么?” 預先假定它們是不同的,但它們不是。 它們被合並,所以沒有區別。
如果要定義單獨的路由以封鎖不返回View結果的操作方法,請繼續操作。 由您決定如何組織您的應用程序。 問“現在哪種方式是創建網絡應用程序的首選方式?” 這是沒有意義的,因為由您來決定您的應用程序,並且在MVC 6長時間投入生產之前,不會有更常見的做事方式。
雖然梅森完美地回答了這個問題,但我想提供一些關於差異的一些額外信息以及一些有望幫助未來訪問者解決問題的資源。
Microsoft將ApiController
和Controller
合並為一個類Controller
。 為了做到這一點,他們刪除了ApiController
一些功能。
這是一篇很好的博客文章,描述了這些變化。
例如,不是將HTTP Action
指定為參數方法的前綴和路由屬性中的路由,而是使用HttpGet
和HttpPost
屬性完成兩者。
[HttpGet("api/visits")]
如果您想從WebApi
項目遷移, 這里有一些指導。
如果您不想遷移,只是想將項目轉換為新的ASP.NET MVC
版本,則可以使用Web API Compatibility Shim
。 在這里和這里你可以找到指導。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.