我创建了一个新的MVC项目,并勾选了API的框。
但是,我打算创建许多API函数,我真的不想填满主控制器文件夹,因此,我认为这对一个区域来说是个很好的用途。
所以,我创建了一个名为API
的区域,但是,无论我做什么,我似乎都无法访问任何API页面。
为了测试,我在API区域创建了另一个名为test
的控制器,我可以按预期访问并执行所有操作。
我直接从MVC2 / 3开始,然后休息了几年......我有点失控,我相信这可能与/App_Start/WebApiConfig.cs
和/Global.asax
文件有关但是,我试图以各种方式编辑它们而没有任何运气。
有谁知道发生了什么以及我需要做些什么才能让API功能在某个区域运行?
答案 0 :(得分:2)
您不需要为Api控制器创建区域,但您的Api控制器必须从ApiController
派生才能获取。只需将控制器组织在文件夹中,而不是创建区域,只要控制器遵循惯例,它们就会被WebApi选中。
在您的WebApiConfig.cs
中,您可以定义路线,但我建议您使用Attribute Based Routing。那么对于每个"区域"你可以创建一个基本api控制器并在类上粘贴`[RoutePrefix(" api / areaName")]属性 - 然后对于该区域中的每个控制器,你只需从该基本控制器派生。
以下是"用户"的快速示例。 api控制器。通过下面的示例,您将能够使用以下网址:
GET
http://localhost:port/api/users GET
http://localhost:port/api/users/some-guid POST
http://localhost:port/api/users 请记住在WebApiConfig
课程中启用基于属性的路由。
<强> WebApiConfig.cs 强>
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
}
}
<强> UsersApiController.cs 强>
[RoutePrefix("api/users")]
public class UsersApiController : ApiController
{
List<User> _users = new List<User> { new User("Foo", "Bar"), new User("Bar", "Foo") };
[Route("")]
public IHttpActionResult Get()
{
var result = _users;
return Ok(result);
}
[Route("{id:guid}")]
public IHttpActionResult Get(Guid id)
{
var result = _users.FirstOrDefault(q => q.Id == id);
if (result == null)
return NotFound();
return Ok(result);
}
[Route("")]
public IHttpActionResult Post([FromBody]PostModel model)
{
// Process the input model
var user = new User(model.FirstName, model.LastName);
// Save user to database
_users.Add(user);
return Created<User>(Request.RequestUri + user.Id.ToString(), user);
}
public class PostModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class User
{
public User(string firstName, string LastName)
{
Id = Guid.NewGuid();
FirstName = firstName;
LastName = lastName;
}
public Guid Id { get; private set; }
public string FirstName { get; private set; }
public string LastName { get; private set; }
}
}