为何要为控制器的每个Action都分配对应的Http请求特性?
ASP.NET控制器Action Http特性相关问题解答
标注与不标注Http特性的核心区别
- 未标注任何Http特性的Action:默认接受所有类型的HTTP请求(GET、POST、PUT、DELETE等均可触发执行)
- 标注了
[HttpGet]/[HttpPost]等特性的Action:仅能响应对应类型的HTTP请求,请求方法不匹配时会直接返回405 Method Not Allowed错误
是否需要为每一个Action都标注Http特性?
建议所有Action都明确标注对应的Http特性,即便是仅返回静态视图、无业务逻辑的Index页面也建议标注[HttpGet],核心原因如下:
- 语义清晰:后续维护代码的开发者可以直接明确该Action的预期请求方式,降低理解成本
- 安全防护:用于数据写入的Action(比如示例中的CreateRecord)如果未标注
[HttpPost],恶意攻击者可以通过GET请求直接触发数据新增/修改逻辑,存在CSRF、非预期操作等安全隐患 - 符合规范:符合常见的HTTP资源操作约定,GET对应资源查询/页面展示、POST对应资源新增、PUT对应资源修改、DELETE对应资源删除,代码规范性更高
为什么移除特性后页面仍然可以正常运行?
你测试时移除ViewDetail和CreateRecord的Http特性后无报错,是因为你发起的请求方法刚好符合该Action的预期调用方式(比如ViewDetail是通过GET跳转访问、CreateRecord是通过表单POST提交),所以可以正常执行。但如果此时出现不符合预期的请求方法(比如用POST访问ViewDetail、用GET访问CreateRecord),未标注特性的Action仍然会执行该请求,就会出现逻辑异常。
内容的提问来源于stack exchange,提问作者Fenr1r絶
相关产品推荐
相关产品推荐

