C# Web Api如何定义具有相同参数的2个方法

C# Web Api如何定义具有相同参数的2个方法,c#,rest,asp.net-web-api2,asp.net-web-api-routing,C#,Rest,Asp.net Web Api2,Asp.net Web Api Routing,我不熟悉Web API。阅读restful让我觉得它是基于动词的,因此我希望逻辑也是如此 如果我想为Delete和Get创建一个API,它们具有相同的签名,我会被告知 [HttpGet] public HttpResponseMessage Index(int id) { return Request.CreateResponse(HttpStatusCode.OK, GetValue()); } [HttpDelete] public HttpResponseMessage Inde

我不熟悉Web API。阅读restful让我觉得它是基于动词的,因此我希望逻辑也是如此

如果我想为Delete和Get创建一个API,它们具有相同的签名,我会被告知

[HttpGet]
public HttpResponseMessage Index(int id)
{
    return Request.CreateResponse(HttpStatusCode.OK, GetValue());
}

[HttpDelete]
public HttpResponseMessage Index(int id)
{
    //logic
    return Request.CreateResponse(HttpStatusCode.OK, true);
}
我希望通过指定不同的动词
WebAPI2
可以说明问题。但即使我将delete更新为(注意void返回类型)

我仍然被告知,因为名为index的成员已经存在相同的参数类型

据介绍,

Action               HTTP method    Relative URI
Get a product by ID      GET            /api/products/id
Create a new product     POST           /api/products
Update a product         PUT            /api/products/id
Delete a product         DELETE         /api/products/id
Get、Put和Delete具有相同的URL。遗憾的是,它们不显示服务器端代码,只显示客户端代码

以下是我唯一的选择:

1. Overload the method (in this example, seems like it would be hacking as it's not needed to perform the required task)
2. Give the method a different name (eg `Delete` instead of `Index`)

或者还有其他方法吗?

您可以在api方法上使用Route属性,请检查以下内容:

[HttpGet]
    [Route("same")]
    public IHttpActionResult get(int id)
    {
        return Ok();
    }

    [HttpDelete]
    [Route("same")]
    public IHttpActionResult delete(int id)
    {
        return Ok();
    }
对于get请求,将http方法设置为get,对于delete请求,将http方法设置为delete,类似于post/put


您有语法问题。您可以使用属性路由来维护相同的路径,但这些方法必须具有不同的名称和结构,否则您将遇到类似于您已经经历过的编译错误

用你问题中的例子

操作HTTP方法相对URI
通过ID Get/api/products/ID获取产品
创建新产品POST/api/products
更新产品PUT/api/products/id
删除产品删除/api/products/id
以下是与上述内容匹配的控制器

[RoutePrefix("api/products")]
public class ProductsController : ApiController {

    [HttpGet]
    [Route("{id:int}")] //Matches GET api/products/1
    public IHttpActionResult Get(int id) {
        return Ok(GetValueById(id));
    }

    [HttpPost]
    [Route("")] //Matches POST api/products
    public IHttpActionResult Post([FromBody]Product model) {
        //...code removed for brevity
    }

    [HttpPut]
    [Route("{id:int}")] //Matches PUT api/products/1
    public IHttpActionResult Put(int id, [FromBody]Product model) {
        //...code removed for brevity
    }

    [HttpDelete]
    [Route("{id:int}")] //Matches DELETE api/products/1
    public IHttpActionResult Post(int id) {
        //...code removed for brevity
    }
}
[RoutePrefix("api/products")]
public class ProductsController : ApiController {

    [HttpGet]
    [Route("{id:int}")] //Matches GET api/products/1
    public IHttpActionResult Get(int id) {
        return Ok(GetValueById(id));
    }

    [HttpPost]
    [Route("")] //Matches POST api/products
    public IHttpActionResult Post([FromBody]Product model) {
        //...code removed for brevity
    }

    [HttpPut]
    [Route("{id:int}")] //Matches PUT api/products/1
    public IHttpActionResult Put(int id, [FromBody]Product model) {
        //...code removed for brevity
    }

    [HttpDelete]
    [Route("{id:int}")] //Matches DELETE api/products/1
    public IHttpActionResult Post(int id) {
        //...code removed for brevity
    }
}