我创建了一个简单的ApiController
whit 3函数。
我有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一样,有人可以解释为什么以及如何解决这个问题?
由于
答案 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 }
);