WebApi冲突调用函数,它忽略了函数名

时间:2015-03-18 17:11:58

标签: c# api asp.net-web-api routing

我创建了一个简单的ApiController whit 3函数。

  • get()//全部获取
  • get(int id)//按ID获取
  • getFirst()//获取列表中的第一个

我有2个场景,我会非常感谢你的解释。

  • 1:如果我只调用get()get(int id),那么当我致电api/controller/{id}时({id}可选)

  • 2:当我尝试访问api/controller/function/{id}(id可选)时,我有3个功能,但它无效。只能通过id获取函数。你可以看到我在下面的错误。

    请求无效。 参数字典包含'Practica.Controllers.PersonController'中'Practica.Models.Person GetById(Int32)'方法的非可空类型'System.Int32'的参数'id'的空条目。可选参数必须是引用类型,可空类型,或者声明为可选参数。

Api类:

public class PersonController:ApiController     {         私人[] listPerson;

    public PersonController() {
        listPerson = new Person[3];
        listPerson[0] = new Person { 
            id = 1,
            firstName = "test",
            lastName = "test",
            email = "test@gmail.com",
            age = 26
        };
        listPerson[1] = new Person
        {
            id = 2,
            firstName = "test",
            lastName = "test",
            email = "test@gmail.com",
            age = 26
        };
        listPerson[2] = new Person
        {
            id = 3,
            firstName = "test",
            lastName = "test",
            email = "test@gmail.com",
            age = 26
        };
    }

    public Person GetById(int id) {
        try
        {
            var person = this.listPerson.Where(p => p.id == id).FirstOrDefault();
            if (person != null)
            {
                return person;
            }
            else {
                throw new InvalidOperationException();
            }
        }
        catch (Exception) {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
    }

    public Person[] Get()
    {
        try
        {
            if (this.listPerson != null)
            {
                return this.listPerson;
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
        catch (Exception)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
    }

    public Person GetFirst()
    {
        try
        {
            if (this.listPerson != null)
            {
                return this.listPerson.Where(x=>x.Equals(1)).FirstOrDefault();
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
        catch (Exception)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
    }
}

WebApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

就像ApiController只识别get和get?id一样,有人可以解释为什么以及如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

自定义方法命名是asp.net web api。

默认情况下,路由配置遵循GET,POST,PUT,Delete的RESTful约定。

Custom method names in ASP.NET Web API

通过这篇文章,它将解决您的问题。

应该使用下面的代码,只需添加{action}

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { action = "get", id = RouteParameter.Optional }
);