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 };
}
所以,我用以下网址测试它
它适用于所有三个.
然后,我去添加另一个Get()方法,这次使用一个id参数
 public string Get(int id)
 {
     return "value";
 }
我再次测试网址.这个时间/ api/bars?h =你好&w = world和api/bars?h =你好失败.错误消息"在控制器'Bar'上找不到与请求匹配的操作."
出于某种原因,这两种方法并不能很好地协同工作.如果我删除Get(int id),它的工作原理.如果我改变int?z到字符串z,然后它可以工作(但是它需要转换我的action方法中的对象!).
为什么Web API会这样做?这是一个bug还是设计?
非常感谢.
问题解决了,但还留下了一个额外的问题。问题似乎是重载的 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 };
    }
}
干杯
| 归档时间: | 
 | 
| 查看次数: | 9721 次 | 
| 最近记录: |