簡體   English   中英

ASMX Web服務方法單例

[英]ASMX Web Service Method Singleton

不知道這是否是正確的術語,請讓我解釋一下我想要什么。

我有網絡上可用的Web服務-該Web服務有1種Web方法。

我想要的是...如果Web服務正在運行並且正在執行任務,並且對該Web服務進行了另一個調用,我希望第二個調用失敗或暫掛一定時間然后失敗。 因為只應一次調用此Web服務的一個實例。

我當時正在考慮向應用程序對象中寫入一個值(例如在asp.net中),但隨后我必須非常小心以確保更新此值,以防萬一出現任何錯誤,它可能不會...所以這是危險,並且會使Web服務處於無法訪問的狀態。

沒有更動態的方法來確定是否調用Web服務嗎?

如果您使用的是WCF,這很簡單。 使用服務限制設置來指定您希望MaxConcurrentCalls = 1和MaxInstances =1。您還需要將ServiceBehaviorConcurrencyMode設置為Single。

您無法使用舊版ASMX Web服務執行此操作。 他們不支持不同的實例方案。

我相信您可以使用WCF進行此操作,因為您可以將服務配置為僅具有一個實例。

對於您是否可以將Web服務器配置為僅啟動1個Web服務實例,我並不了解Web服務,但是您可以嘗試在Web服務中創建互斥體。

Mutex是進程間同步對象,可用於檢測Web服務的另一個實例是否正在運行。

因此,您可以做的是創建一個具有名稱的互斥量,然后等待。 如果您的Web服務的多個實例仍在運行,則互斥鎖將等待。

您可以在web方法內部實施檢查,因為它將在同一IIS進程中運行

您可以創建一個窮人的互斥體,並讓第一個實例創建一個文件,並讓連續的實例檢查文件的存在。 嘗試捕獲您的Web方法,然后將刪除的文件最終放置。

如果您是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);
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM