![](/img/trans.png)
[英]How can I call two GET Web API REST methods, the first to get the count of records that the second one will return?
[英]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.