2009-12-01 61 views
16

我寫了一個WCF服務,但存儲在Service實現中的數據不會在調用之間持續存在,即使存儲在一個靜態變量中。我能做什麼?如何使用內存中持久性存儲編寫WCF服務?

服務實現如下:

public class Storage : IStorage 
{ 
    protected static object[] _data; 

    #region IStorage Members 

    public void Insert(object[] data) 
    { 
     lock (_data) 
     { 
      _data = _data.Concat(data).ToArray(); 
     } 
    } 

    public object[] SelectAll() 
    { 
     lock (_data) 
     { 
      return (object[])_data.Clone(); 
     } 
    } 

    #endregion 
} 

服務主機是一個控制檯應用程序:

static void Main(string[] args) 
{ 
    ServiceHost serviceHost = 
     new ServiceHost(typeof(TimeSpanStorage)); 
    serviceHost.Open(); 
    Console.WriteLine("Service running. Please 'Enter' to exit..."); 
    Console.ReadLine(); 
} 

回答

17

默認情況下,WCF instanceMode被設置爲Per call,這意味着服務中使用的數據特定於該方法調用的客戶端。

在您執行嘗試添加

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Single)] 
public class MyService: IService 

這使得本質上是服務單。

+1

設置情境模式'Single'不一定是做正確的事 - 這不會允許每筆交易的狀態。使用'DurableOperation'是一個更好的選擇。 – 2009-12-01 14:08:24

+0

我同意它不會允許交易控制持久服務。當你想要縮放時,單身模式defo有它的限制。 「數據...不挖牆角調用之間」只是讓我覺得OP是簡單的東西之後。 – MattC 2009-12-01 14:11:44

+0

設置InstanceContextMode爲單是一個可怕的想法 - 你的WCF服務類是單現在,你不已經系列化所有的請求的處理(殺死任何性能),或者你需要處理多線程問題(硬且容易出錯)。最好的選擇是耐用的服務,這種服務真的只是將他們的狀態存儲在一個持久的商店(又名數據庫)中。 – 2009-12-01 14:31:55

8

你所希望做的是創造一個durable service

WCF耐用服務是WCF服務 ,其中操作可以記住 客戶端的私有變量(=服務的 狀態)之間的值 重新啓動服務器主機和/或客戶端 。

+0

謝謝你的回答。我在Durable服務中沒有找到內存持久性選項。有沒有?或者只是數據庫持久性選項? – 2009-12-01 15:25:55

+2

鏈接不再顯示爲指向原始文章 – 2013-07-03 02:28:07

+0

請參見http:// msdn。microsoft.com/en-us/library/vstudio/bb628514(v=vs.90).aspx – Jono 2013-12-08 18:42:28

3

你想在你的ServiceHost實例的生命週期之後堅持數據嗎?如果是這樣,那麼我同意持久服務是有道理的。

但是,如果你只想要調用之間的數據保存到您的WCF服務而服務是活,那麼經久耐用是矯枉過正愚見。使用靜態數據完全可以接受;這正是我在我的WCF項目中所做的。事實上,你已經顯示的代碼應該工作,所以其他事情正在發生。

Main()方法是否與實際顯示的一樣?如果是這樣,那麼這是一個問題。只要啓用WCF的控制檯應用程序啓動,它立即關閉,並將WCF服務與之關閉。您需要有一些邏輯來保持控制檯應用程序的活動狀態,因爲WCF服務只會在控制檯應用程序運行時保持「託管」狀態。

如果這不是問題,請告訴我,我將添加一個簡單應用程序的完整代碼,演示如何執行此操作。

+0

沒有Main方法有一個Console.ReadLine調用。這個問題被編輯來反映這一點。 – 2009-12-01 15:19:15

+0

什麼「服務還活着」是什麼意思?這意味着「服務主機控制檯應用程序正在運行」? – 2009-12-01 15:20:10

+2

@Jader迪亞斯:是的,如果你只是想留存數據'ServiceHost'控制檯應用程序運行時,那麼就沒有必要使用耐用的服務方針。這種持久的服務方法可以工作,但靜態數據方法也是如此(再次,這就是我在我的WCF服務項目中使用的方法)。 – 2009-12-01 16:07:19

-4

地址:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 

你上面的類,你就會有一個服務,它是一個單一實例(即類proterties保持不變),並允許多個併發連接。

現在你必須照顧你的財產讀/寫,即使用鎖已經完成(或其他技術)。

+3

重複回答 – 2010-12-13 10:37:49