在Web API中,当一个方法包含可空值类型作为参数时,如何重载Get

Joh*_*ohn 6 asp.net-web-api visual-studio-2012

UPDATE

我最初的假设是可选参数是问题的原因.这似乎是不正确的.相反,当其中一个方法包含某些参数的可空值类型(例如int?)时,它似乎是多个动作方法的问题.

我正在使用Visual Studio 2012 RC,我刚刚开始使用Web API.我遇到了一个问题,并收到错误"在控制器上找不到与请求相匹配的'Bars'."

我有一个Bars控制器.它有一个Get()方法,它接受可选参数.

public IEnumerable<string> Get(string h, string w = "defaultWorld", int? z=null)
{
    if (z != 0)
        return new string[] { h, w, "this is z: " + z.ToString() };
    else
       return new string[] { h, w };
}
Run Code Online (Sandbox Code Playgroud)

所以,我用以下网址测试它

  • / API /棒ΔH=你好
  • / API /条?H =你好&W =世界
  • / API /条?H =你好&W =世界&Z = 15

它适用于所有三个.

然后,我去添加另一个Get()方法,这次使用一个id参数

 public string Get(int id)
 {
     return "value";
 }
Run Code Online (Sandbox Code Playgroud)

我再次测试网址.这个时间/ api/bars?h =你好&w = world和api/bars?h =你好失败.错误消息"在控制器'Bar'上找不到与请求匹配的操作."

出于某种原因,这两种方法并不能很好地协同工作.如果我删除Get(int id),它的工作原理.如果我改变int?z到字符串z,然后它可以工作(但是它需要转换我的action方法中的对象!).

为什么Web API会这样做?这是一个bug还是设计?

非常感谢.

Nic*_*sen 2

问题解决了,但还留下了一个额外的问题。问题似乎是重载的 Action 方法在可选参数方面存在问题。

所以新的问题是为什么会这样,但我会把这个问题留给比我级别低的人;)

但这是个好消息。我不喜欢你报告的问题,并且走复杂类型的路线,虽然很高兴知道,但这只是一个偷工减料的修复,并且会非常糟糕地反映 Web Api 中的某些内容是如何工作的。因此,好消息是,如果您遇到此问题,只需取消可选参数即可解决,采用良好的重载路线即可。好消息,因为这绝不是一个偷工减料的修复,只是让你失去了一些可选参数的便利性:

public class BarsController : ApiController
{
    public string Get(int id)
    {
        return "value";
    }

    public IEnumerable<string> Get(string h)
    {
        return Get(h, null, null);
    }

    public IEnumerable<string> Get(string h, string w)
    {
        return Get(h, w, null);
    }

    public IEnumerable<string> Get(string h, string w, int? z) 
    {
        if (z != 0)
            return new string[] { h, w, "this is z: " + z.ToString() };
        else
            return new string[] { h, w };
    }
}
Run Code Online (Sandbox Code Playgroud)

干杯