ASMX Web服务方法Singleton

时间:2009-10-01 06:26:41

标签: c# web-services asmx

不确定这是否是正确的术语,让我解释一下我想要的内容。

我有一个可在网络上使用的网络服务 - 网络服务有1个网络方法。

我想要的是......如果Web服务正在运行并执行任务并且对此Web服务进行了另一次调用,我希望第二次调用失败或挂起一段时间然后失败。因为一次只能调用此Web服务的一个实例。

我在考虑为应用程序对象写一个值(比如在asp.net中)但是我必须非常小心地确保这个值得到更新,如果有任何错误,它可能不会...所以这很危险,并且会使Web服务处于无人能够达到的状态。

是否有更动态的方法来确定是否要调用Web服务?

6 个答案:

答案 0 :(得分:3)

如果您使用的是WCF,这很简单。使用service throttling settings指定您希望MaxConcurrentCalls = 1和MaxInstances = 1.您还需要为ConcurrencyModeServiceBehavior设置为单身。

答案 1 :(得分:3)

您无法使用旧版ASMX Web服务执行此操作。他们不支持不同的实例方案。

我相信您可以使用WCF执行此操作,因为您可以将服务配置为只有一个实例。

答案 2 :(得分:1)

我不了解Web服务是否可以将Web服务器配置为仅启动1个Web服务实例,但您可以尝试在Web服务中创建互斥锁。

Mutex是一个进程间同步对象,可用于检测Web服务的另一个实例是否正在运行。

因此,您可以做的是创建一个带有名称的互斥锁,然后等待它。如果您的Web服务的多个实例处于活动状态,则互斥锁将等待。

答案 3 :(得分:1)

您可以在webmethod内部实施检查,因为它将在同一个IIS进程中运行

答案 4 :(得分:1)

您可以创建一个穷人的互斥锁并让第一个实例创建一个文件并让连续实例检查文件是否存在。尝试捕获您的Web方法并将文件的删除放在finally中。

答案 5 :(得分:0)

如果您是WCF,我建议使用“bobbymcr”答案,但是对于旧版Web服务,您可以使用Monitor代替mutex,因为互斥是昂贵的(因为它是一个内核对象),但如果你不关心它的性能和响应能力。服务只使用Mutex。

请参阅此示例以了解如何使用Monitor类

private static object lockObject = new object();

public void SingleMethod()
{
try
{
Monitor.TryEnter(lockObject,millisecondsTimeout);
//method code
}
catch
{
}
finally
{
Monitor.Exit(lockObject);
}

}