簡體   English   中英

如果使用命名空間版本路由,如何在ASP.Net Core API中設置RESTful屬性路由

[英]How do I set up RESTful attribute routing in ASP.Net Core API if using Namespace version routing

我正在構建一個ASP.Net Core 1.1.0 Web API。

作為支持性的評論,我選擇使用Peter Lazzarino的versionrouting NuGet軟件包,以允許我根據版本將控制器分為不同的命名空間(和文件夾)。 我按照Peter的建議在Startup.cs中對其進行了配置,並且生成時沒有錯誤。 我在用

var apiPrefix = "api";  

根據Peter的建議,在Startup.cs中使用,以允許我所有的路由都以api開頭。

我想遵循RESTful准則,並為我的方法使用HTTP動詞屬性。

我希望我的客戶能夠訪問http://companyname.com/api/v1/mycontroller/status ,由於我的API項目中的文件夾“ Controllers \\ v1 \\ MyController.cs”中包含MyController,因此版本路由庫應該能夠找到它。

在我的控制器中,我有以下內容:

namespace MyProject.Controllers.v1
{
    public class MyController : Controller
    {

        // GET: ~/api/v1/mycontroller/status
        [HttpGet("/status")]
        public JsonResult Status()
        {
            return Json(new { status = "API is running" });
        }

    }
}

但是,導航到http://companyname.com/api/v1/mycontroller/status給我一個404錯誤。

我曾嘗試在SO帖子中將此問題作為注釋留待評論, 如何在ASP.NET Core Web Api中完成版本控制 ,但是我在StackOverflow中的信譽尚不足以發表評論。 :(

因此,希望這里有人可以幫助我。

在此先感謝您提供的任何幫助。

您可以按照asp.net核心文檔中指定的方式在控制器上使用Routes Attributes,這樣就可以對api進行版本控制,但是隨后您必須將其添加到每個控制器中,以使代碼保持同步,我不知道確切的位置您可以將其全局添加。 希望這可以幫助

您可以簡單地用以下方法裝飾控制器:

[Route("api/v1/[controller]/[action]")]
public class MyController : Controller
{

    // GET: ~/api/v1/mycontroller/status
    [HttpGet]
    public JsonResult Status()
    {
        return Json(new { status = "API is running" });
    }

}

那么您的路線將是:

http://companyname.com/api/v1/mycontroller/status 

解決問題的方法要求我不要為該類使用任何Route屬性(因為命名空間版本化的NuGet代碼實質上是為api / v1 / mycontroller構建MapRoute),並且也不要在HttpGet action屬性前面使用正斜杠。屬性(即[HttpGet(“ Status”)]而不是[HttpGet(“ / Status”)])。 一旦做出更改,它就會按預期開始工作。

當時不支持此特定功能, API版本控制現在支持使用API版本約定即時實現此特定設置。

您只需要配置您的應用程序並在模板中應用路由約束。

services.AddApiVersioning(options =>
    options.Conventions.Add( new VersionByNamespaceConvention() );

現在,您的服務僅需定義為:

[ApiVersion("1.0")]
[ApiController]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
public class MyController : ControllerBase
{
    // GET: ~/api/v1/my/status
    [HttpGet]
    public IActionResult Status()
    {
        return Ok(new { status = "API is running" });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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