C# &引用;“真的”;通过MVC4WebAPI的REST路由

C# &引用;“真的”;通过MVC4WebAPI的REST路由,c#,asp.net,api,rest,asp.net-routing,C#,Asp.net,Api,Rest,Asp.net Routing,TL;灾难恢复摘要:我可以为HTTP GET、PUT和DELETE配置MVC Web API路由吗? 我一直在研究用私有API替换旧的数据访问层(一个基于数据集和TableAdapters的DLL),如果成功的话,希望创建一个公共API。我用MVC4做了一些工作来更新我们的前端,并且喜欢使用它,因此在深入研究基于WS或WCF的库之前,探索“WebAPI”项目类型似乎是明智的 初始演示允许我很好地返回XML/JSON,例如: //service.url/api/Users 。。。返回用户列表,而特

TL;灾难恢复摘要:我可以为HTTP GET、PUT和DELETE配置MVC Web API路由吗?

我一直在研究用私有API替换旧的数据访问层(一个基于数据集和TableAdapters的DLL),如果成功的话,希望创建一个公共API。我用MVC4做了一些工作来更新我们的前端,并且喜欢使用它,因此在深入研究基于WS或WCF的库之前,探索“WebAPI”项目类型似乎是明智的

初始演示允许我很好地返回XML/JSON,例如:

//service.url/api/Users

。。。返回用户列表,而特定用户的详细信息可通过以下方式访问:

//service.url/api/Users/99

到目前为止,一切都很平静。但是,为了将URI真正映射到资源,我想对上面列出的URI执行HTTP PUT(新用户)或HTTP DELETE(删除用户)。在我看到的所有这些项目的示例中,以及Visual Studio中提供的脚手架中,都遵循了以下约定:

//service.url/api/Users/Create

//service.url/api/Users/Delete/99

//service.url/api/Users/Update/99

。。。等等这感觉像是在回避我的问题,这是一个耻辱,当有什么东西已经放在一起这么好


关于如何最好地实现这一点,您有什么想法吗?

您想要的是MVC Web API中的默认设置。我不确定你在看什么,但这里有一个很好的例子

例如,您可能需要:

public class UsersController : ApiController
{
  // GET http://service.url/api/Users/1
  [HttpGet]
  public User GetUser(int id);

  // POST http://service.url/api/Users/?name=richard...
  [HttpPost]
  public User AddUser(User model);      

  // PUT http://service.url/api/Users/?id=1&name=Richard...
  [HttpPut]
  public User UpdateUser(User model);

  // DELETE http://service.url/api/Users/1
  [HttpDelete]
  public User DeleteUser(int id);
}

我已经显式地设置了这些,但是
GetUser
DeleteUser
不需要前缀,因为它们都是前缀。

Erik提供的链接是一个很好的开始,但是我看到,当寻找一个简单的RESTful API来使用HTTP谓词执行这些CRUD操作时,它会混淆这种情况。如果您希望使用HTTP动词GET、PUT、POST和DELETE(可能还有补丁,但我不在这里介绍),并且您可以使用约定,那么下面的操作将起作用:

public class UsersController : ApiController
{
    // GET http://service.url/api/Users
    public User GetAllUsers(){ ... }

    // GET http://service.url/api/Users/1
    public User GetUser(int id){ ... }

    // POST http://service.url/api/Users/
    // User model is passed in body of HTTP Request
    public User PostUser([FromBody]User model){ ... }

    // PUT http://service.url/api/Users/1
    // User model is passed in body of HTTP Request
    public User PutUser(int id, [FromBody]User model){ ... }

    // DELETE http://service.url/api/Users/1
    public User DeleteUser(int id){ ... }
}
请注意,在Web API中使用HTTP谓词操作约定时,不需要方法上的属性。另外,请注意,我在POST和PUT的用户参数上使用了[FromBody]属性,以表示主体包含我希望发送的数据。如果您试图附加到资源,并且我还没有尝试使用Web API通过查询参数创建/修改数据,那么这对于POST来说可能不是最方便的。将您的数据放在正文中肯定会让通话感觉非常干净。“在此资源的正文中发布/放置此内容。”


此外,我在规范中阅读PUT的方式很可能是错误的,那就是它充当了一个替代品。考虑到上面最后一行,这也是有道理的。我把这个资源放在这个位置,替换已经存在的资源。spec()声明:“如果请求URI引用了一个已经存在的资源,那么所包含的实体应该被视为驻留在源服务器上的实体的修改版本。”他们使用的术语是“修改的”,所以我想这为最终用户留下了足够的解释空间。这就是修补程序的作用(),但我现在没有足够的信息对此进行评论。

您要查找的实际上是Web API中的默认路由。你遇到了什么问题?谢谢,太棒了!我不知道命名约定是如此精细。