属性路由失败 - Web Api

时间:2014-12-18 12:21:39

标签: asp.net asp.net-web-api attributerouting

我在名为JobController的控制器上有两个动作,它有这个路径前缀

[RoutePrefix("API/Job")]

第1个动作(按照控制器中的优先顺序)

[Route("{jobId}/{user}"), System.Web.Http.HttpPost]
public HttpResponseMessage AssignUser(long jobId, string user)

第二行动

[HttpPost]
[Route("{id}/comment/")]
public HttpResponseMessage SaveComment(string commentText, long id)

使用Postman向此路线发布帖子 - MyDomain/API/Job/11/Comment - 评论文字值为" foo"匹配第一条路线,而不是我想要的路线。

为什么会发生这种情况?

3 个答案:

答案 0 :(得分:0)

只是猜测,但我认为WebAPI无法区分路线1和2,因为"评论"也可以是用户名。您可以将第一条路线更改为:

[Route("{jobId}/users/{user}"), System.Web.Http.HttpPost]
public HttpResponseMessage AssignUser(long jobId, string user)

答案 1 :(得分:0)

这里的问题是两个动作都具有相同的动作(POST),相同数量的参数和相同类型的参数,因此首先匹配路线将获胜。

您的路线需要区分两条路线,因此您需要将路线更改为具有不同的动作(例如POST与PUT)或者您将一条路线更改为此类路线

[HttpPost]
[Route("{id}/comments/{comment}")]
public HttpResponseMessage SaveComment(long id, string comment)

希望这会有所帮助。

答案 2 :(得分:0)

最后我刚创建了单独的ViewModels

[HttpPost]
[Route("comment")]
public HttpResponseMessage SaveComment([FromBody] JobCommentViewModel viewModel)

public class JobCommentViewModel
{
    public long JobId { get; set; }
    public string Comment { get; set; }
}