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

我试图通过重写ApiControllerExecuteAsync方法来解决这个问题,但目前为止没有运气。 有关此问题的任何建议?

编辑:我忘了提及,现在我试图移动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属性。


从这里开始:

config.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });

为此:

config.Routes.MapHttpRoute("API Default", "api/{controller}/{action}/{id}",
            new { id = RouteParameter.Optional });

因此,你现在可以指定你想要发送HTTP请求的动作(方法)。

张贴到“http:// localhost:8383 / api / Command / PostCreateUser”调用:

public bool PostCreateUser(CreateUserCommand command)
{
    //* ... *//
    return true;
}

并发布到“http:// localhost:8383 / api / Command / PostMakeBooking”调用:

public bool PostMakeBooking(MakeBookingCommand command)
{
    //* ... *//
    return true;
}

我在一个自我托管的WEB API服务应用程序中尝试了这一点,它的功能就像一个魅力:)


我发现属性比使用代码手动添加属性更清晰。 这是一个简单的例子。

[RoutePrefix("api/example")]
public class ExampleController : ApiController
{
    [HttpGet]
    [Route("get1/{param1}")] //   /api/example/get1/1?param2=4
    public IHttpActionResult Get(int param1, int param2)
    {
        Object example = null;
        return Ok(example);
    }

}

你的webapiconfig中也需要这个

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

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

一些好的链接http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api这个解释路由更好。 http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

链接地址: http://www.djcxy.com/p/20555.html

上一篇: Single controller with multiple GET methods in ASP.NET Web API

下一篇: JSONP with ASP.NET Web API