在不干扰现有合同的情况下,将新参数添加到Web API操作方法

时间:2016-03-15 03:17:34

标签: asp.net-mvc asp.net-web-api2 asp.net-mvc-routing

我的web api 2.0项目中已经有了一个动作方法。我想在不干扰现有合同的情况下添加新参数。最好的方法是什么?欣赏任何最佳实践提示:)

这是我打算做的代码示例:

现有代码:

[Route("{myId}",Name="MyId")]
Public IHttpActionResult Get(String myId)
{
  //Some more code here
}

网址:http://localhost:8888/webapi/1111

期望做类似下面的事情:

//I want to keep the route name same for backwards compatibility.
[Route("{myId}/{myName}",Name="MyId")]
Public IHttpActionResult Get(String myId,string? myName)
{
  //Some more code here
}

网址:http://localhost:8888/webapi/1111/John 上面提到的Url正确地命中了方法,但是我从来没有得到用John填充的第二个参数(myName)。

感谢大家对此的任何帮助。 SREE。

2 个答案:

答案 0 :(得分:1)

在您的示例中,您myNamestring?,不允许这样做:

  

类型'string'必须是非可空值类型才能在泛型类型或方法'System.Nullable'中将其用作参数'T'

创建了一个测试控制器来实现您的操作

[RoutePrefix("webapi")]
public class TestsController : ApiController {
    [HttpGet]
    [Route("{myId}/{myName}", Name = "MyId")]
    public IHttpActionResult Get(string myId, string myName) {
        //Some code to show the values of the parameters
        return Ok(new { myId = myId, myName = myName });
    }
}

使用webapi/1111/John进行测试时,会返回以下响应

{"myId":"1111","myName":"John"}

确实包含MyName的值John

如果尝试向后uri webapi/1111,则会返回NotFound响应,因为模板与新操作不匹配。

要解决此问题,您需要使myName参数可选。要了解有关该检查的更多信息

Optional URI Parameters and Default Values

新路线看起来像

//NOTICE THE `?` ON THE {myName} TEMPLATE
[Route("{myId}/{myName?}", Name = "MyId")]
public IHttpActionResult Get(string myId, string myName = null) {...}

您会注意到myName在路由{myId}/{myName?}和操作参数(string myId, string myName = null)中已成为可选项

现在,当使用webapi/1111进行测试时,会返回以下响应

{"myId":"1111","myName":null}

这符合您的预期结果以实现向后兼容性。

答案 1 :(得分:0)

字符串是一种引用类型,所以你不需要让它可以为空,它已经是。删除'?'并从属性中删除名称。那么会发生什么?