我正在使用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
。我发现这种行为令人困惑有几个原因:
HttpGet
:System.Web.Http.HttpGet
和System.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]
的使用存在哪些假设?
答案 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项目中时。当我不小心包含错误的命名空间时,我咬了几次。