为什么ApiController需要在方法上使用显式的Http动词?

时间:2013-05-14 16:28:00

标签: c# asp.net-mvc-4

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

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)

在后一种情况下,我可以执行GET / POST而不指定HttpGetAttribute。我发现这种行为令人困惑有几个原因:

  • 现在有两个HttpGetSystem.Web.Http.HttpGetSystem.Web.Mvc.HttpGet
  • System.Web.Http.HttpGe t是必需的,GET请求需要<{1}}
  • System.Web.Mvc.HttpGet次请求需要唯一的路由ApiController

/api/controller...让我陷入成功之中。较新的Controller需要手持。

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

ApiController

动词是方法名称以及一些时髦的 public void Post([FromBody]string value) { } 事件。也许这就是为什么这样设置的原因?关于导致这种设计的[FromBody]的使用存在哪些假设?

1 个答案:

答案 0 :(得分:6)

如果遵循内置约定,则API控制器不需要对方法进行谓词操作。如果您使用正确的动词,Get,Post等为您的方法名称添加前缀,则无需使用该属性进行修饰。

在你的情况下。

public string GetRead(int)

以及我正在进行的项目中的实例

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

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

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

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