gpt4 book ai didi

c# - 防止多次调用 Web 服务

转载 作者:太空狗 更新时间:2023-10-29 17:53:49 25 4
gpt4 key购买 nike

我为我的客户提供了一个 Web 服务,允许他向生产数据库添加一条记录。

我最近发生了一件事,我客户的程序员在循环中调用服务,迭代调用我的服务数千​​次。

我的问题是什么是防止此类事情发生的最佳方法。

我想到了一些办法:1.在服务入口处,我可以为调用该服务的每个客户端更新计数器,但这看起来太笨拙了。2.检查调用该服务的客户端IP,每次调用该服务时都会升起一个标志,然后每隔一小时重置标志。

我很肯定有更好的方法并且会采纳任何建议。

谢谢,大卫

最佳答案

首先,您需要查看您的情况的法律方面:与您客户签订的契约(Contract)是否允许您限制客户的访问权限?

这个问题超出了SO的范围,但是你必须想办法回答它。因为如果您在法律上有义务处理所有请求,那么就没有办法绕过它。此外,对您的情况的法律分析可能已经包括一些限制,您可以通过这种方式限制访问。这反过来会对您的解决方案产生影响。

抛开所有这些问题,只关注技术方面,您是否使用某种用户身份验证? (如果不是,为什么不呢?)如果你这样做,你可以实现你决定在每个用户群上使用的任何方案,我认为这将是最干净的解决方案(你不需要依赖 IP 地址,这是一个某种丑陋的解决方法)。

一旦您找到了识别单个用户的方法,就可以实现多项限制。我首先想到的是这些:

  1. 同步处理
    仅在处理完所有先前的请求后才开始处理请求。这甚至可以只在您的主要处理方法中使用 lock 语句来实现。如果您采用这种方法,
  2. 处理请求之间的时间延迟
    要求在一个处理调用之后必须经过特定时间才能允许下一个调用。最简单的解决方案是在用户 session 中存储一个 LastProcessed 时间戳。如果您采用这种方法,则需要开始考虑在允许处理新请求时如何响应 - 您是否向调用者发送错误消息?我认为你应该...

编辑
lock 语句,简要解释:

它旨在用于线程安全操作。语法如下:

lock(lockObject)
{
// do stuff
}

lockObject 需要是一个对象,通常是当前类的私有(private)成员。结果是,如果您有 2 个线程都想执行此代码,第一个到达 lock 语句的线程将锁定 lockObject。虽然它确实如此,但第二个线程无法获取锁,因为该对象已经被锁定。所以它只是坐在那里等待,直到第一个线程在 } 退出 block 时释放锁。只有这样,第二个线程才能锁定 lockObject 并执行它的操作,阻止任何第三个线程进入 lockObject,直到它也退出该 block 。

小心,线程安全的整个问题绝非微不足道。 (可以说唯一微不足道的是程序员可能犯的许多微不足道的错误;-) See here介绍 C# 中的线程

关于c# - 防止多次调用 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11500076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com