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

P.B*_*key 3 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)
Run Code Online (Sandbox Code Playgroud)

我习惯于Controller允许我创建方法而不通过Attributes指定合法动词的类型:

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

    // GET questioncomment/5
    public string Read(int id)
Run Code Online (Sandbox Code Playgroud)

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

  • 现在有两个HttpGet:System.Web.Http.HttpGetSystem.Web.Mvc.HttpGet
  • System.Web.Http.HttpGe需要T,System.Web.Mvc.HttpGet不是需要GET请求
  • ApiController 请求需要一条独特的路线 /api/controller...

Controller让我陷入成功之中.较新的ApiController需要手持.

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

    public void Post([FromBody]string value)
    {
    }
Run Code Online (Sandbox Code Playgroud)

动词是方法名称,还有一些时髦的[FromBody]东西.也许这就是为什么这样设置的原因?ApiController对于这种设计的使用存在哪些假设导致了这种设计?

Khe*_*pri 6

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

在你的情况下.

public string GetRead(int)
Run Code Online (Sandbox Code Playgroud)

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

[Authorize]
public HttpResponseMessage GetStoreList([FromUri]NamedViewModel model)
Run Code Online (Sandbox Code Playgroud)

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

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

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