簡體   English   中英

在Web Api中,如何在不使用屬性的情況下使用兩個get方法指定到一個控制器的兩條單獨的路由?

[英]In Web Api, how can I specify two separate routes to one controller with two get methods without using attributes?

我有一個帶有兩個Get方法的Account控制器,一個方法獲取所有帳戶並且不輸入任何內容,另一個方法將Id int並返回該特定帳戶。

項目約束是我們不能在默認路由上將id作為可選參數,而是需要通過不同的路由訪問“一個帳戶”和“所有帳戶”,並且不能使用屬性路由。 因此,我們的路由配置當前如下所示:

config.Routes.MapHttpRoute("AccountWithId", "api/account/{id}", new { action = "Get", id = RouteParameter.Optional }
                , new { httpMethod = new HttpMethodConstraint(HttpMethod.Get), id = @"\d+" });

config.Routes.MapHttpRoute("Default", "api/{controller}");

我在AccountController上的兩個Get方法如下所示:

public IHttpActionResult Get()
        {
            IList<AccountDto> users = m_service.Get();

            return Ok(users);
        }

        public IHttpActionResult Get(int accountId)
        {
            AccountDto user = m_service.Get(accountId);

            return Ok(user);
        }

但是,當我通過自定義路由在測試中使用id參數調用Get並按如下所示進行調試時,它仍然會遇到不帶id參數並返回全部的Get方法。

var url = "http://test/api/account/" + accountId;

var response = await m_server.HttpClient.GetAsync(url);

知道為什么嗎?

我在這里可以看到很多問題。

您的第一個路由未指定默認控制器,令您驚訝的是,發送帳戶ID時未收到404。

其次,如果id參數是可選的,則正則表達式應為\\ d *而不是\\ d +。

第三,您的操作中的參數名稱應與您的路由參數匹配,因此應將accountId更改為id。

嘗試以下方法進行路由:

config.Routes.MapHttpRoute("AccountWithId",
    "api/account/{id}",
    new { controller = "Account", action = "Get", id = RouteParameter.Optional },
    new { httpMethod = new HttpMethodConstraint(HttpMethod.Get), id = @"\d*" }
);

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

然后將您的動作簽名更改為:

public IHttpActionResult Get()
{
    ...
}

public IHttpActionResult Get(int id)
{
    ...
}

暫無
暫無

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

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