我有一个MVC4应用程序,我创建了一个基于webapi的测试控制器,如下所示:
public class User1
{
public int Id { get; set; }
public string name { get; set; }
public User1(int id, string name)
{
this.Id = id;
this.name = name;
}
}
public class Test1Controller : ApiController
{
public User1 Get(int id)
{
return new User1(id, "hello");
}
}
我注意到我有一个webapiconfig类:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
我假设这将默认输出json结果正确吗?
当我去:
http://localhost:61146/api/test1/get/1
或
http://localhost:61146/test1/get/1
我收到此错误:
The resource cannot be found.
这是如何映射的,还是我必须将其放入特殊文件夹?我猜它会自己映射它,因为我继承自ApiController
答案 0 :(得分:5)
在Web API中,名称Post,Get,Put,Delete(默认情况下)映射为请求方法名称,而不是操作名称。您的API路线是:
api/{controller}/{id}
请求:
api/test1/get/1
找不到合适的匹配项,因为框架会尝试将4个令牌与唯一的现有路径定义匹配,其中包含3个令牌(文字api
和两个令牌:controller
和{{1 }})。
如果您尝试:
id
框架将正确找到 api/test1/get
,但是,基于路由配置,将令牌Test1Controller
绑定到"get"
参数。当框架尝试根据您的请求(GET请求)找到合适的方法时,它会找到id
并找到匹配但无法将令牌Get(int id)
转换为整数,这标志着该方法不适合该请求。
但是,如果您尝试此请求:
"get"
它会将令牌api/test1/1
转换为int "1"
,方法1
将匹配。
在Asp.NET Web API中,路由有时会令人困惑。我发现明确地映射我的路线让我更好地理解了这个请求。我建议AttributeRouting integrated in the next version of the Web Api。