首页 新闻 会员 周边

.net core webapi 只允许POST

0
悬赏园豆:50 [待解决问题]

我知道在每一个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方式了、

leeviny的主页 leeviny | 初学一级 | 园豆:164
提问于:2019-06-19 21:22
< >
分享
所有回答(4)
1

通过 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") }));
});
dudu | 园豆:30994 (高人七级) | 2019-06-19 21:43

我用的是2.2的,没有 UseEndpoints这个,也引用不了。我按照您说的这个思路,正在努力查资料。请问对于2.2该怎么处理这个,您知道吗?多谢

支持(0) 反对(0) leeviny | 园豆:164 (初学一级) | 2019-06-19 21:58

@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") }));
});
支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2019-06-19 22:07

@dudu: 按照你给的这个我写到Starup里面了,但是我用网页还是直接能请求到Action,网上这方面的资料太少了,哎

支持(0) 反对(0) leeviny | 园豆:164 (初学一级) | 2019-06-19 22:18

@leeviny: 我回答时在 asp.net core 3.0 是实际验证通过的,刚在 asp.net core 2.2 测试的确不起作用

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2019-06-19 22:30
0

一个api中所有方法都是post方式?花大力气实现了,实际开发中能用到几次?就为了少写一个注解,得不偿失啊

刘下来 | 园豆:919 (小虾三级) | 2019-06-20 00:57
0

如果你的 api 路径模式类似 /api/xxxx 的话,可以在UseMvc 之前加个中间件,过滤所有非 POST 方式访问 /api 的请求。

不如隐茶去 | 园豆:559 (小虾三级) | 2019-06-20 10:20
0

太多实现方式
1.管道处理,自定义一个 delegatingHandler,截取HTTP请求,非httppost 直接返回错误.
2.ActionFilter处理.
3.路由约束定义

gt1987 | 园豆:1150 (小虾三级) | 2019-07-19 11:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册