我編寫了一個簡單的WCF服務,用於存儲用戶發送的消息,並在詢問時將這些消息發送給目標用戶。基於XML的存儲的WCF服務。併發性問題?
<messages recipient="username">
<message sender="otheruser">
...
</message
</messages>
有可能不止一個用戶在同一時間將消息發送到同一收件人,可能導致:就目前而言,持續性是通過創建具有以下結構用戶名 .xml文件執行該xml文件將被同時更新。 WCF服務目前使用basicHttp綁定實現,沒有任何併發訪問規定。
什麼併發的風險有哪些?我應該如何處理它們?對正在訪問的xml文件執行ReadWrite鎖定? 目前該服務最多可以運行5個用戶,可能會增長到50個,但不會超過。
編輯: 由於客戶如上所述將實例化一個新的服務類每叫它做。 (InstanceContext是PerCall,ConcurrencyMode不相關)這是在服務上使用basicHttpBinding和默認設置所固有的。
下面的代碼:
public class SomeWCFService:ISomeServiceContract
{
ClassThatTriesToHoldSomeInfo useless;
public SomeWCFService()
{
useless=new ClassThatTriesToHoldSomeInfo();
}
#region Implementation of ISomeServiceContract
public void IncrementUseless()
{
useless.Counter++;
}
#endregion
}
的行爲是,如果它被寫:
public class SomeWCFService:ISomeServiceContract
{
ClassThatTriesToHoldSomeInfo useless;
public SomeWCFService()
{}
#region Implementation of ISomeServiceContract
public void IncrementUseless()
{
useless=new ClassThatTriesToHoldSomeInfo();
useless.Counter++;
}
#endregion
}
所以併發從來都不是問題,直到您嘗試訪問某些外部存儲的數據在數據庫或一份文件。 不足之處在於,除非將其存儲在外部,否則無法在該服務的方法調用之間存儲任何數據。
爲什麼,感謝廣泛的答覆!爲了滿足客戶需求,我的程序設計儘可能多,所以我只想探索幾種解決方案來生成工作代碼。有一個CRUD操作數據庫在我的列表中(我正在考慮SQLight),但首先我想構建一個強大的基於fileIO的系統,只是爲了瞭解它是如何工作的以及出現什麼問題。 – Dabblernl 2009-08-07 07:44:37
我不知道單身WCF服務:該服務在II6託管在遠程計算機上,客戶端通過basicHttpBinding的訪問。每個客戶都會產生自己的「IServiceContract」實施實例嗎?還是單身人士的默認? – Dabblernl 2009-08-07 07:45:35
客戶端不知道或需要了解有關如何實例化服務的任何信息:單個,每個調用或每個會話。客戶端只需通知客戶端代理並開始調用它的方法。如何創建服務實例是服務方關心的問題。默認的InstanceContextMode是每個會話。基本上,每個客戶端連接都會創建一個新的服務實例,並且其生命週期必須與該連接的持續時間綁定。 – 2009-08-11 11:19:10