2013-11-18 3 views
0

После продолжительного обсуждения с точки зрения того, как наш API необходимо будет вести себя из-за ограничения конструкции серверной, я хотел бы иметь следующие возможности:ASP.NET Web 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. Я изо всех сил, когда я пытаюсь сделать запрос PUT на случай # 1 и # 3:

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. Я хотел бы быть в состоянии получить все эти случаи работы.

+0

Если маршрутизация 'апи/v1/Работа/{действие}/{JobId}', как на земле это соответствие ничего подобного "/ студенты/251/занятости/работы? –

ответ

2

Вы можете посмотреть маршрут маршрутизации (Web API 1 и Web 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) { ... } 
} 
Смежные вопросы