2

我有一个 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 继承的

4

1 回答 1

5

在 Web API 中,名称 Post、Get、Put、Delete(默认情况下)映射为请求方法名称,而不是操作名称。您的 API 路线是:

api/{controller}/{id}

和请求:

api/test1/get/1

找不到合适的匹配项,因为框架将尝试将 4 个标记匹配到唯一现有的路由定义,其中包含 3 个标记(文字api和两个标记:controllerid)。

如果你试试:

 api/test1/get

框架会找到Test1Controller正确的,但会根据路由配置将令牌绑定"get"id参数。当框架尝试根据您的请求(GET 请求)找到合适的方法时,它会找到Get(int id)并找到匹配项,但无法将令牌转换"get"为整数,这表明该方法不适合请求。

但是,如果您尝试此请求:

api/test1/1

它将令牌转换"1"为 int1 并且方法Get(int id)将是匹配的。

在 Asp.NET Web API 中,路由有时会令人困惑。我发现明确映射我的路线可以让我更好地理解请求。我建议将AttributeRouting集成到下一个版本的 Web Api中。

于 2013-07-08T18:40:48.937 回答