我有点困惑。我有一个控制器(派生自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
不需要。看起来我错了。
这是如何运作的?
答案 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动词和匹配路由。