小编典典

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

all

在 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
上运行?


阅读 67

收藏
2022-07-14

共1个答案

小编典典

这是我发现支持额外 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 属性。

2022-07-14