gpt4 book ai didi

.net - 如何确保一次仅调用一次 asmx Web 服务?

转载 作者:行者123 更新时间:2023-12-04 17:59:01 24 4
gpt4 key购买 nike

我有一个 asmx Web 服务,应该只允许一次响应 1 个客户端。

换句话说,如果服务被客户端 A 调用,而服务器 B 调用,我希望 B 挂起直到 A 完成然后 B 可以得到服务。

如果这太复杂了,那么在 A 使用服务期间,来自 B 的最少调用应该会失败并显示用户定义的错误。

原因是该服务严重依赖 IO 操作和 XML 序列化,因此该服务不会同时被 1 个以上的客户端调用是至关重要的。

提前致谢

最佳答案

static object _LockObject = new object();

void WebServiceCall()
{
lock(_LockObject)
{
// Do work...
}
}

创建一个静态对象,您称之为 lock()在。 lock()语句将阻止其他调用执行内部代码,直到获得锁的第一次执行完成。

请注意,根据您的超时设置,B 可能会因超时而失败,具体取决于 A 完成所需的时间。

更新:是的,您可以使用 Monitor类(class)代替 lock() .您可以使用 Monitor.TryEnter()检查对象是否已被锁定的方法(即:如果您想返回错误而不是等待)。

更多详情:

来自 http://msdn.microsoft.com/en-us/library/aa664735(VS.71).aspx :

形式的锁定语句
lock (x) ...

其中 x 是一个引用类型的表达式,正好等价于
System.Threading.Monitor.Enter(x);
try {
...
}
finally {
System.Threading.Monitor.Exit(x);
}

来自 http://msdn.microsoft.com/en-us/library/de0542zz.aspx :

使用 Enter 获取作为参数传递的对象上的 Monitor。如果另一个线程对该对象执行了 Enter,但还没有执行相应的 Exit,则当前线程将阻塞,直到另一个线程释放该对象。

因此,代码知道阻塞而不是跳过只是设计使然。如果需要,可以使用 Monitor.TryEnter() 方法跳过。

关于.net - 如何确保一次仅调用一次 asmx Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397433/

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