【问题标题】:ASP.NET Web API Action RoutingASP.NET Web API 动作路由
【发布时间】:2013-11-18 20:55:28
【问题描述】:

由于后端设计的限制,我们的 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。我希望能够使所有这些案例都能正常工作。

【问题讨论】:

  • 如果你的路由是 'api/v1/Employment/{action}/{jobId}' 它到底如何匹配'/students/251/employment/jobs'之类的东西?

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


【解决方案1】:

您可能想查看属性路由(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) { ... }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2018-08-28
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2013-06-15
    • 2014-04-08
    相关资源
    最近更新 更多