ASP.NET Web API操作路由

时间:2013-11-18 20:55:28

标签: asp.net-web-api asp.net-mvc-routing asp.net-routing

经过长时间讨论,由于后端设计的限制,我们的API需要如何表现,我希望有以下可能性:

1. /students/251/employment <--- allow GET, PUT, POST
2. /students/251/employment/jobs <--- allow GET only
3. /students/251/employment/jobs/435 <--- allow all verbs
4. /students/251/employment/internships <--- allow GET only
5. /students/251/employment/internships/664 <--- allow all verbs

这些案例适用于GET请求。当我尝试对案例#1和#3执行PUT请求时,我很挣扎:

Case #1 Error
  No HTTP resource was found that matches the request URI '/students/251/employment/221'.,
  No action was found on the controller 'Employment' that matches the name '221'.

Case #3 Error
  The requested resource does not support http method 'PUT'.

以下是我的控制器方法的简略版本:

public ApiEmploymentGetResult Get(long id) {            
  // code omitted
}        

[HttpGet]
public IEnumerable<ApiJob> Jobs(long id) {
  // code omitted
}

[HttpGet]
public IEnumerable<ApiOwnVenture> OwnVenture(long id) {
  // code omitted
}

public void Put(long id, MyModel model) {
  // breaks before getting here
}

我的路由看起来像这样,但我不确定它是否正确,即使GET正在工作。

context.Routes.MapHttpRoute(
  name: "V1/EmploymentApi",
  routeTemplate: "api/v1/Employment/{action}/{jobId}",
  defaults: new { controller = "Employment", jobId = RouteParameter.Optional, action = "Get" }
);

案例#1似乎是冲突的,因为框架期待一个行动而不是221.我希望能够让所有这些案件都有效。

1 个答案:

答案 0 :(得分:2)

您可能需要查看属性路由(Web API 1Web API 2)。

public class StudentsController : ApiController
{
    [HttpPut]
    [Route("students/{studentId}/employment")]
    public void UpdateStudentEmployment(int studentId) { ... }

    [HttpPut]
    [Route("students/{studentId}/employment/jobs/{jobId}")]
    public void UpdateStudentEmploymentJob(int studentId, int jobId) { ... }
}