![](/img/trans.png)
[英]ASP.NET Core WebAPI FromBody attribute is not validating object non-reference fields
[英]Non-attribute routes in ASP.Net Core WebApi
我需要構建項目,實現供應商應用程序預定義的REST API(將使用它) - 大約有數千個REST資源,其中一些操作由不同的HTTP-Verb(POST,GET,PUT,DELETE等)定義。 )。
所以,理想情況下,對於每個資源,我應該有這樣的單個類:
public class SomethingController
{
public Something Post(string name, DateTime time)
{
// ...
}
public int PostStrange(string text)
{
// ...
}
public Something Put([FromBody]Something item)
{
// ...
}
public void Delete(int id)
{
// ...
}
}
在以前的版本中,我可以在注冊路由時調用MapHttpRoute,從ApiController
繼承這樣的類 - 而ASP.NET Web Api將根據需要進行...但在.NET Core中我找不到像MapHttpRoute / ApiController這樣的東西。現在有路由和http-verb屬性,我需要為每個類/方法明確定義所有內容:
[Route("api/[controller]")]
public class SomethingController : Controller
{
[HttpPost]
public Something Post(string name, DateTime time)
{
// ...
}
[HttpPost("api/[controller]/strange")]
public int PostStrange(string text)
{
// ...
}
[HttpPut]
public Something Put([FromBody]Something item)
{
// ...
}
[HttpDelete]
public void Delete(int id)
{
// ...
}
}
為每個成千上萬的REST資源編寫這個屬性非常無聊且容易出錯......
我在這里想念一下嗎? 為什么在新的和現代的ASP.NET Core中,與舊的ASP.NET相比,構建REST-Api這樣過於復雜的常見且重要的事情呢?
有一個nuget包Microsoft.AspNetCore.Mvc.WebApiCompatShim
,其主要目標是使從web api遷移到核心更容易。 它還提供了一種方法來執行基於約定的路由到您需要的操作。 所以,首先安裝該軟件包,然后在啟動時:
public void ConfigureServices(IServiceCollection services) {
// add conventions here
services.AddMvc().AddWebApiConventions();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
app.UseMvc(routes => {
// map one global route
routes.MapWebApiRoute("WebApi", "api/{controller}");
});
}
在這個小配置之后,您可以從ApiController
繼承您的控制器, ApiController
在上面的包中添加,以方便從web api遷移,或者本機asp.net核心Controller
。 ApiController
示例:
public class SomeController : ApiController {
// maps to GET /api/Some
// note - no routing attributes anywhere
public HttpResponseMessage Get() {
return new HttpResponseMessage(HttpStatusCode.OK);
}
// maps to POST /api/Some
public HttpResponseMessage Post() {
return new HttpResponseMessage(HttpStatusCode.OK);
}
}
原生asp.net核心控制器:
// mark with these attributes for it to work
[UseWebApiRoutes]
[UseWebApiActionConventions]
public class TestController : Controller {
// maps to GET /api/Test
// no routing attributes, but two "conventions" attributes
public IActionResult Get(string p) {
return new ObjectResult(new { Test = p });
}
}
您還可以使用以下屬性標記基本控制器:
[UseWebApiRoutes]
[UseWebApiActionConventions]
public class BaseController : Controller {
}
public class TestController : BaseController {
// maps to GET /api/Test
// no attributes
public IActionResult Get(string p) {
return new ObjectResult(new { Test = p });
}
}
如果您不是從web api遷移 - 我建議使用本機Controller
。 ApiController
具有不同的結構(類似於asp.net web api ApiController),因此沒有太多理由將其用於除預期目標之外的任何其他內容(從web api遷移)。
MapRoute
仍在那里https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing
屬性路由補充MapRoute
,而不是替換它。
顯然,有很多例子放棄了關於路由的文章以簡化示例。 所以只需挖挖斗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.