6

我正在使用ApiController. 我很难理解为什么 ApiControllers 在某些方面与 Controllers 不同。

public class QuestionCommentController : ApiController
{
    QuestionCommentCRUD crud = new QuestionCommentCRUD();

    // GET api/questioncomment/5
    [HttpGet]
    public string Read(int id)

我习惯于Controller允许我在不通过属性指定合法动词的情况下创建方法的类型:

public class QuestionCommentController : Controller
{
    QuestionCommentCRUD crud = new QuestionCommentCRUD();

    // GET questioncomment/5
    public string Read(int id)

在后一种情况下,我可以在不指定HttpGetAttribute. 我发现这种行为令人困惑,原因如下:

  • 现在有两个HttpGetSystem.Web.Http.HttpGetSystem.Web.Mvc.HttpGet
  • System.Web.Http.HttpGet 是必需的,System.Web.Mvc.HttpGetGET请求不需要
  • ApiController请求需要唯一的路由/api/controller...

Controller'''让我掉进了成功的坑里。较新的ApiController需要手持。

我注意到默认模板有一个我不明白的语法:

    public void Post([FromBody]string value)
    {
    }

动词是方法名称以及正在发生的一些时髦[FromBody]的事情。也许这就是为什么事情是这样设置的?ApiController关于导致这种设计的使用存在哪些假设?

4

1 回答 1

8

如果您遵循内置约定,您的 API 控制器不需要在方法上使用动词。如果您在方法名称前加上适当的动词、Get、Post 等,则无需使用属性进行装饰。

在你的情况下。

public string GetRead(int)

以及我目前正在从事的一个项目中的一个活生生的例子

[Authorize]
public HttpResponseMessage GetStoreList([FromUri]NamedViewModel model)

无需装饰,因此不需要 System.Web.Http.HttpGet。

您可以按照上面列出的方式或我的方式进行操作。WebApi 允许您执行您认为合适的 REST 或 RPC 样式调用。这就是你看到差异的原因。包含对 RESTful 风格调用的支持需要额外的工作。

我同意这两个单独的 HttpGet 属性令人困惑,尤其是当它们都包含在开箱即用的 WebApi 项目中时。当我不小心包含了错误的命名空间时,这让我难过几次。

于 2013-05-14T16:44:47.457 回答