簡體   English   中英

ASP.Net Core WebApi中的非屬性路由

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM