.net 如何在web api中处理重复的POST请求

.net 如何在web api中处理重复的POST请求,.net,asp.net-web-api,.net,Asp.net Web Api,我有一个场景,用户在表单中输入他的所有详细信息,然后在Asp.NETWebAPI中单击Submit(PostRequest)。如果用户单击Post按钮两次会怎么样。我如何处理这个请求 任何人都可以回答这个问题。如果您使用视图模型,这是您不应该知道的事情,但是因为这是api,所以事情应该有点复杂 您可以争辩@sm在用户提交请求时禁用submit按钮,但是如果您提供的是纯api,并且您不对消费者负责。那就不可能了 我们在办公室里做的事情是最重要的 象征式握手。 在访问API端点之前,每个POST、P

我有一个场景,用户在表单中输入他的所有详细信息,然后在Asp.NETWebAPI中单击Submit(PostRequest)。如果用户单击Post按钮两次会怎么样。我如何处理这个请求


任何人都可以回答这个问题。

如果您使用视图模型,这是您不应该知道的事情,但是因为这是api,所以事情应该有点复杂

您可以争辩@sm在用户提交请求时禁用submit按钮,但是如果您提供的是纯api,并且您不对消费者负责。那就不可能了

我们在办公室里做的事情是最重要的

  • 象征式握手。 在访问API端点之前,每个POST、PUT、PATCH、DELETE请求(几乎所有非GET请求)都应该从服务器获取令牌。在本部分中,您可以检查用户请求令牌使用的次数。这很复杂,但您可以跟踪用户的活动。您还可以设置请求的阈值,如果用户的请求超出了用户可以发送的合理请求,则可以禁止该用户,而不必破坏您的api

  • 使用特殊的秘密头属性。 如果您提供的api是供私人商业使用的,请使用机密标头密钥,并将cred提供给将使用您的api的受信任方

  • GET和POST的不同模型。为了上帝,在您的操作方法中使用DTO而不是直接使用POCO类

  • 我不太熟悉,但我们的DEVOps确保,如果我们提供公共api。应在IIS prod环境中进行DDOS过滤配置


  • 我完全不同意@keysl,如果您正在创建一个API,您可能应该考虑使其成为RESTFul,并且rest服务应该是幂等的,也许:

    在REST API的上下文中,当发出多个相同的请求时,与发出单个请求具有相同的效果

    更新

    帖子的效果是一样的,一个新的记录被创建!如果存在唯一性约束,则应返回正确的状态代码,例如400。在API的I work on中,我们将返回400和一个JSON对象,其中包含验证/验证失败的原因

    如果API是公开的,那么这就是你所能做的,你不能为人们用什么来攻击你的API负责。我在一个拥有上千个端点的公共API上工作,我们不担心用户意外提交两次数据,我们只是验证数据的唯一性

    如果这个问题是关于支持网站的私有端点,那么我完全同意禁用submit按钮,但是您仍然应该在后端API中使用验证,前端应该优雅地处理400的返回


    虽然@keysl所说的都是有效的东西(除了DTO是POCO,说起来很奇怪),但我认为第1点、第2点和第4点与问题无关,视图模型与用户点击两次按钮无关

    在用户单击后禁用该按钮it@sme如果您仅提供api,则不可能这样做。请尝试使用基于令牌的api调用。使用oauth。Post方法不是幂等的。在您链接和引用的文章中:“通常-不一定-Post API用于在服务器上创建新资源。因此,当您调用相同的Post请求N次时,服务器上将有N个新资源。因此,Post不是幂等的。”如果您进一步考虑这一点,如果资源具有唯一性约束(例如,标签系统,如tags on,因此标签名称必须是系统唯一的),第二个请求如何不违反此条件?第二个应该失败