如何确保只能一次调用一次asmx Web服务?

JL.*_*JL. 5 .net web-services asmx

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

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

如果这太复杂,那么在A接入服务的过程中,来自B的最低限度的呼叫将失败并且用户定义的错误.

原因是该服务在很大程度上依赖于IO操作和XML序列化,因此至关重要的是该服务不会被多个客户端同时调用.

提前致谢

Cor*_*ton 4

static object _LockObject = new object();

void WebServiceCall()
{
    lock(_LockObject)
    {
        // Do work...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

更多细节:

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

形式的锁定语句

lock (x) ...
Run Code Online (Sandbox Code Playgroud)

其中 x 是引用类型的表达式,精确等于

System.Threading.Monitor.Enter(x);
try {
   ...
}
finally {
   System.Threading.Monitor.Exit(x);
}
Run Code Online (Sandbox Code Playgroud)

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

使用 Enter 获取作为参数传递的对象上的监视器。如果另一个线程已经对该对象执行了 Enter,但尚未执行相应的 Exit,则当前线程将阻塞,直到另一个线程释放该对象。

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