我知道在每一个Action上加[httppost] 就能只接受POST请求,
[HttpPost]
public ActionResult<IEnumerable<string>> post()
{
return new string[] { "value", "Value" };
}
我是想知道有没有一劳永逸的办法?不在每一个Action上加,让每一个新建的Action天然的就只支持POST。实在是想不到有什么办法了。类似于想实现这样的功能,
[HttpPost]
public class ValuesController : ControllerBase
{
public ActionResult<IEnumerable<string>> PostAction()
{
return new string[] { "value", "Value" };
}
}
我知道这样是不对的,只是为了表明我的想法,在某个地方实现类似于“全局”的东西,然后请求 PostAction 就只能是POST方式了、
通过 HttpMethodRouteConstraint 路由约束可以轻松搞定,以下是 asp.net core 3.0 的示例代码
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}",
constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint("POST") }));
});
我用的是2.2的,没有 UseEndpoints这个,也引用不了。我按照您说的这个思路,正在努力查资料。请问对于2.2该怎么处理这个,您知道吗?多谢
@leeviny: asp.net core 2.2 的代码如下:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}",
defaults: null,
constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint("POST") }));
});
@dudu: 按照你给的这个我写到Starup里面了,但是我用网页还是直接能请求到Action,网上这方面的资料太少了,哎
@leeviny: 我回答时在 asp.net core 3.0 是实际验证通过的,刚在 asp.net core 2.2 测试的确不起作用
一个api中所有方法都是post方式?花大力气实现了,实际开发中能用到几次?就为了少写一个注解,得不偿失啊
如果你的 api 路径模式类似 /api/xxxx
的话,可以在UseMvc
之前加个中间件,过滤所有非 POST 方式访问 /api
的请求。
太多实现方式
1.管道处理,自定义一个 delegatingHandler,截取HTTP请求,非httppost 直接返回错误.
2.ActionFilter处理.
3.路由约束定义