Asp.net mvc 多个放置操作,asp.net mvc 4 web api

Asp.net mvc 多个放置操作,asp.net mvc 4 web api,asp.net-mvc,rest,asp.net-web-api,Asp.net Mvc,Rest,Asp.net Web Api,为此,我正在尝试使用asp.NETMVC4构建一个web api。假设我们有图书资源。Get、Post、Delete都可以,但万一Post让我有点困惑。我希望使用PUT的方式类似于CQR:一个用于更新标题的操作PUT,另一个用于更新作者的操作PUT,另一个用于使书成为最受欢迎的操作PUT。所有这些PUT操作都使用不同类型的命令重载,并且它们只有一个参数。当我尝试从MVC向这个资源路由发出一个PUT请求时失败了,表示有多个PUT操作与请求匹配。有谁能建议如何配置路由以处理: public Http

为此,我正在尝试使用asp.NETMVC4构建一个web api。假设我们有图书资源。Get、Post、Delete都可以,但万一Post让我有点困惑。我希望使用PUT的方式类似于CQR:一个用于更新标题的操作PUT,另一个用于更新作者的操作PUT,另一个用于使书成为最受欢迎的操作PUT。所有这些PUT操作都使用不同类型的命令重载,并且它们只有一个参数。当我尝试从MVC向这个资源路由发出一个PUT请求时失败了,表示有多个PUT操作与请求匹配。有谁能建议如何配置路由以处理:

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

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

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

由于每个函数之间实际上没有太多关系,所以应该尝试将每个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
    }
}

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

/books/{bookId}/favouritestate/{state}  
/books/{bookId}/title/{title}  
/books/{bookId}/author/{author}  
 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
        }

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

   routes.MapHttpRoute(
                name: "BookTitleApiRoute",
                routeTemplate: "books/{bookId}/title/{title}  ",
                defaults: new {controller = "BookTitleController", title = RouteParameter.Optional}
                );
然后添加一些控制器。例如:

/books/{bookId}/favouritestate/{state}  
/books/{bookId}/title/{title}  
/books/{bookId}/author/{author}  
 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=)

很抱歉这么晚才发表评论。。。这适用于Put,但是如果您有多个来自同一控制器的get或post呢?在同一个控制器中有多个GET和POST是一个好主意吗?您能提供需要多个GET或POST的资源示例吗?至于Get,您可以使用方法覆盖。另外还有一个补丁谓词,用于部分更新。RPC?这意味着什么?我认为这些反对票是针对你们例子中的RPC风格的机制的。这是假设/暗示它们实际上是无关的。你没有直接回答这个问题。