ASP.NET Web API中具有多个GET方法的单个控制器

在Web API中,我有一类类似的结构:

public class SomeController : ApiController

{

[WebGet(UriTemplate = "{itemSource}/Items")]

public SomeValue GetItems(CustomParam parameter) { ... }

[WebGet(UriTemplate = "{itemSource}/Items/{parent}")]

public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }

}

由于我们可以映射各个方法,因此在正确的位置获得正确的请求非常简单。对于只有一个GET方法但也有一个Object参数的类似类,我成功使用IActionValueBinder。但是,在上述情况下,出现以下错误:

Multiple actions were found that match the request:

SomeValue GetItems(CustomParam parameter) on type SomeType

SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType

我试图通过覆盖ExecuteAsync方法来解决此问题,ApiController但到目前为止还没有运气。关于这个问题有什么建议吗?

编辑:我忘了提一下,现在我正尝试在ASP.NET Web API上移动此代码,而ASP.NET Web

API具有不同的路由方法。问题是,如何使代码在ASP.NET Web API上工作?

回答:

这是我发现支持额外的GET方法以及支持常规REST方法的最佳方法。将以下路由添加到WebApiConfig:

routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });

routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");

routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });

routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new {action = "Post"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Post)});

我通过下面的测试类验证了此解决方案。我能够在下面的控制器中成功命中每种方法:

public class TestController : ApiController

{

public string Get()

{

return string.Empty;

}

public string Get(int id)

{

return string.Empty;

}

public string GetAll()

{

return string.Empty;

}

public void Post([FromBody]string value)

{

}

public void Put(int id, [FromBody]string value)

{

}

public void Delete(int id)

{

}

}

我确认它支持以下请求:

GET /Test

GET /Test/1

GET /Test/GetAll

POST /Test

PUT /Test/1

DELETE /Test/1

注意 ,如果多余的GET操作不是以“ Get”开头,则可能需要向该方法添加HttpGet属性。

以上是 ASP.NET Web API中具有多个GET方法的单个控制器 的全部内容, 来源链接: utcz.com/qa/399323.html

回到顶部