2

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

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

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

public HttpResponseMessage Put(UpdateAuthor ua){/*code*/}
4

2 回答 2

6

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

/books/{bookId}/favouritestate/{state}  
/books/{bookId}/title/{title}  
/books/{bookId}/author/{author}  

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

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

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

 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
        }

    }

您还可以在诸如此类的对象之间进行交互。

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

于 2012-05-03T18:57:47.667 回答
0

由于每个函数之间实际上并没有太大关系,因此您应该尝试将每个 put 方法放在单独的相应控制器中。

public class MakeFavoriteController : ApiController
{
    public HttpResponseMessage Put(MakeFavorite mf)
    {
        // Code
    }
}

public class ChangeTitleController : ApiController
{
    public HttpResponseMessage Put(ChangeTitle ct)
    {
        // Code
    }
}

public class UpdateAuthorController : ApiController
{
    public HttpResponseMessage Put(UpdateAuthor ua)
    {
        // Code
    }
}
于 2012-05-03T18:44:48.537 回答