Web.API和FromBody

时间:2013-02-06 21:59:05

标签: asp.net-mvc-4 asp.net-web-api

我有点困惑。我有一个控制器(派生自ApiController),它有以下方法:

[ActionName("getusername")]
public string GetUserName(string name)
{
    return "TestUser";
}

我的路由设置如下:

config.Routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

当我尝试用fiddler中的GET命中/api/mycontroller/getusername/test时,我一直收到400错误。

我发现当我将[FromBody]添加到GetUserName中的name参数时,一切正常。

我在某种程度上认为[FromBody]用于HttpPost,表示该参数位于帖子正文中,因此GET不需要。看起来我错了。

这是如何运作的?

2 个答案:

答案 0 :(得分:6)

您需要将路由更改为:

config.Routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{name}",
    defaults: new { name = RouteParameter.Optional }
);

或将参数名称更改为:

[ActionName("getusername")]
public string GetUserName(string id)
{
    return "TestUser";
}

注意:其他路由参数必须与方法参数名称匹配。

答案 1 :(得分:1)

如果它更接近您的要求,您还可以执行以下操作:

// GET api/user?name=test
public string Get(string name)
{
    return "TestUser";
}

这假设您使用名为ApiController的{​​{1}},并允许您将UserController参数作为查询字符串传递。这样,您不必指定name,而是依赖HTTP动词和匹配路由。