UPDATE
我最初的假设是,可选参数是问题的原因。 这似乎是不正确的。 相反,它似乎是与多个操作方法的问题时,这些方法之一包含空值类型(如int?)对一些参数。
我使用Visual Studio 2012 RC和我刚开始接触网络API。 我碰到的一个问题,并得到错误“没有行动上的控制器‘酒吧’与请求匹配找到”。
我有一个酒吧控制器。 它有一个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 };
}
所以,我测试它与以下网址
- / API /棒ΔH=你好
- / API /条?H =你好&W =世界
- / API /条?H =你好&W =世界&Z = 15
它适用于所有三种。
然后,我去添加另一个get()方法,此时用一个ID参数
public string Get(int id)
{
return "value";
}
我再次测试的URL。 这一次/ API /条?H =你好&W =世界和API /酒吧?H =你好失败。 该错误信息是“没有行动控制器‘酒吧’与请求匹配上找到。”
出于某种原因,这两种方法没有很好地一起玩。 如果我删除Get(int id)
它的工作原理。 如果我改变INT? Z到字符串Z,那么它的工作原理(,但随后需要将我的操作方法里面的对象!)。
为什么网页API这样做呢? 这是一个错误或设计?
非常感谢。
问题解决了,但是,它留下一个额外的问题。 这个问题似乎是重载的操作方法具有与该可选参数的问题。
因此,新的问题是,为什么这样,但我会离开,截至下级家伙比我;)
但是,这是一个好消息。 我不喜欢你报告的问题,并打算在复合型路线,而很高兴知道,简直是杰里钻机修复,并会反映的东西是如何在Web API的使用非常糟糕。 因此,好消息是,如果你有这个问题,这是通过简单地脱离了可选的PARAMS解决,做良好的醇”重载路线。 好消息,因为这绝不是一个杰里钻机修复,只会让你变得宽松一点的可选参数方便:
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 };
}
}
干杯
我还没有发现针对此问题的真正答案,但(这是什么原因API这样做),但我有一种变通方法,它允许一个重载的get()。 诀窍是包装在一个对象中的参数值。
public class Foo
{
public string H { get; set; }
public string W { get; set; }
public int? Z { get; set; }
}
而到了酒吧控制器修改,以
public IEnumerable<string> Get([FromUri] Foo foo)
{
if (foo.Z.HasValue)
return new string[] { foo.H, foo.W, "this is z: " + foo.Z.ToString() };
else
return new string[] { foo.H, foo.W, "z does not have a value" };
}
[FromUri]
是必要的,因为的WebAPI不,在默认情况下,使用URI参数,以形成“复杂”的对象。 总的想法是,复杂的对象是从哪里来<form>
行动,而不是GET请求。
我仍然会继续检查,为什么网页API的行为这种方式,如果这其实是一个错误或预期的行为。
您可以在路由添加动作参数超载WEB API控制方法。
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new {action = "Get", id = RouteParameter.Optional }
);
一旦你在你的路线这种变化,那么你可以打电话给你的方法,如
/api/bars/get?id=1
/api/bars/get?h=hello&w=world&z=15
希望这有助于。
奥马尔
文章来源: In Web API, how do you overload Get when one method contains with nullable value types as parameters