多个PUT动作,asp.net mvc 4 web api

vou*_*rin 2 rest asp.net-mvc asp.net-web-api

我正在尝试使用asp.net mvc 4构建一个web api.假设我们有Books资源.获取,发布,删除工作正常,但万一发布我有点困惑.我想要使​​用PUT的方式是CQRS,例如:一个动作PUT用于更新标题,另一个动作PUT用于更新作者,另一个用于更新书籍.所有这些PUT操作都被不同类型的命令重载,并且它们只有一个参数.当我尝试向此资源发出一个PUT请求时,来自MVC的路由失败,说这是与请求匹配的多个PUT操作.任何人都可以建议如何配置路由来处理:

public HttpResponseMessage Put(MakeFavorite mf){/*code*/}

public HttpResponseMessage Put(ChangeTitle ct){/*code*/}

public HttpResponseMessage Put(UpdateAuthor ua){/*code*/}
Run Code Online (Sandbox Code Playgroud)

Ale*_*iev 6

我认为最好不要在这里应用RPC,即使David解决方案有一些RPC工件.首先,你应该设计你的URI结构.例如:

/books/{bookId}/favouritestate/{state}  
/books/{bookId}/title/{title}  
/books/{bookId}/author/{author}  
Run Code Online (Sandbox Code Playgroud)

然后更新您的路由表以处理此问题:

   routes.MapHttpRoute(
                name: "BookTitleApiRoute",
                routeTemplate: "books/{bookId}/title/{title}  ",
                defaults: new {controller = "BookTitleController", title = RouteParameter.Optional}
                );
Run Code Online (Sandbox Code Playgroud)

然后添加一些控制器.例如:

 public class BookTitleController : ApiController
    {
        // GET /books/{bookId}/title/
        public HttpResponseMessage Get(string bookId)
        {
            return your book title
        }
        // PUT /books/{bookId}/title/{title}
        public HttpResponseMessage Put(string bookId,string title)
        {
            update book title and return result
        }

    }
Run Code Online (Sandbox Code Playgroud)

你也可以在这样的对象之间插入关系等.

希望这将有助于ypu构建漂亮的RESTful API =))