簡體   English   中英

使用不是 Web API 中的 id 的第二個參數路由到 controller

[英]Routing to controller with a second parameter that's not an id in Web API

1)我有一個 controller 前綴路線即公司。

當我調用以下操作時:

[HttpGet]
public async Task<IHttpActionResult> GetCompanies(...
{
    ...
}

它返回公司列表,但現在我想聲明第二個操作,我可以在其中返回公司列表及其前 3 個聯系人,所以我想我會使用以下路線定義我的新操作:

[HttpGet]
[Route("Contacts")]
public async Task<IHttpActionResult> GetCompaniesAndContacts(...
{
    ...
}

由於RoutePrefix被定義為

[RoutePrefix("Companies")]

我以為我可以使用以下命令調用我的 uri:

http://localhost/companies/contacts

但這似乎總是打擊 GetCompanies 行動。

我只能假設我的路線沒有被處理,但我不確定如何添加這樣一個特定的操作

config.Routes.MapHttpRoute(....)

2)另外,定義第二條路線 rest 的方法是否符合標准,還是使用查詢字符串參數來指示我想包含用戶更好?

../公司../公司/用戶

謝謝

更新-1:

這就是我在 WebApiConfig.cs 中的 Register function 已經嘗試添加特定路線但沒有運氣:

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: "OrganizationWithUsers",
    routeTemplate: "api/Companies/Contacts"
);

更新2:

如果我刪除:

[HttpGet]
public async Task<IHttpActionResult> GetCompanies(...
{
    ...
}

它調用

[HttpGet]
[Route("Contacts")
public async Task<IHttpActionResult> GetCompaniesAndContacts(...
{
    ...
}

但我收到錯誤The value 'contacts' is not valid for Guid. .

嗯...我可以看到發生了什么,但我不知道如何解決它。 我還有一個 GetCompany,它的定義如下:

[HttpGet]
public async Task<IHttpActionResult> GetCompany(Guid id)

所以看起來這個現在正在被擊中,這是有道理的。

我試圖在這個上添加一個約束並將我的路由添加回 GetCompaniesAndContacts 並刪除 RoutePrefix 但它不起作用。

我認為存在沖突,因為我有 2 個相同的 get 並且無法區分這 2 個。

更新3:

這是所要求的完整定義:

[RoutePrefix("Companies")]
[ValidationModel]
[ApiException]
public class CompaniesController : BaseController
{
    ...
    [HttpGet]
    public async Task<IHttpActionResult> GetCompanies(
        int pageIndex,
        int pageSize,
        string orderBy,
        OrderByDirection orderByDirection,
        string filters)
    {
       ...
    }

    [HttpGet]
    [Route("Contacts")]
    public async Task<IHttpActionResult> GetCompaniesAndContacts(
        int pageIndex,
        int pageSize,
        string orderBy,
        OrderByDirection orderByDirection,
        string filters)
    {
       ...
    } 
}

創建一個新項目,我能夠創建一個新的 controller,編寫 2 個 GET 操作

public class TestController : Controller
{
    public string GetCompanies()
    {
        return "Companies";
    }

    public string GetCompaniesAndContacts()
    {
        return "Companies & Contacts";
    }
}

以下 2 個 URL 按預期工作

無需更改路線。

現在我看到您正在嘗試設置特定的路由模式,所以我將代碼更改為...

routes.MapRoute(
    name: "Company Routes",
    url: "api/Companies/{action}/{id}",
    defaults: new {controller = "Test", action = "GetCompanies", id = UrlParameter.Optional}
);

我在默認路由之前添加了上述路由,然后以下 URL 按預期工作

我建議您在一個新的臨時項目中使用路由,然后將理解應用到您的用例中。

我發現了我的問題,它歸結為路由前綴!

我把它定義為:

[RoutePrefix("companies")]
public class CompaniesController : BaseController
{
}

當它應該被定義為:

[RoutePrefix("api/companies")]
public class CompaniesController : BaseController
{
}

一旦按上述方式定義,我就可以使用

[HttpGet]
public async Task<IHttpActionResult> GetCompanies(
    int pageIndex,
    int pageSize,
    string orderBy,
    OrderByDirection orderByDirection,
    string filters)
{
...
}

要求公司只使用

http://localhost/api/companies?PageIndex...

並要求公司和主要聯系人,我只需要用“聯系人”定義新路線。

[HttpGet]
[Route("Contacts")]
public async Task<IHttpActionResult> GetCompaniesAndContacts(
    int pageIndex,
    int pageSize,
    string orderBy,
    OrderByDirection orderByDirection,
    string filters)
{
...
}   

我現在可以這樣稱呼它:

http://localhost/api/companies/contacts?PageIndex...

愚蠢的錯誤,但仍然希望這對其他人有所幫助。 不要忘記在前綴路由中包含您的api !!

暫無
暫無

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

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