[英]Duplex Wcf Service Application, List keep values from last application running
我實現了通過使用“ WCF服務應用程序”構建的服務。 該應用程序還具有兩個客戶端,並且可以作為雙工使用。 (wsDualHttpBinding)
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1
{
private static List<int> lst = new List<int>();
public void Subscribe()
{
lst.Add(1);
//....
奇怪的是,當我運行該應用程序時,列表從上次運行時“記住”其值..而lst.Count從整個應用程序的完全不同運行中變得越來越大。 我找不到原因。 我還嘗試將InstanceContextMode設置為其他然后是single,但這沒有幫助。 謝謝,利隆。
這是因為您使用的是靜態字段,該字段在所有調用之間共享。
並且由於InstanceContextMode = InstanceContextMode.Single
。 它使您的服務以單調模式工作,這意味着僅為您的所有客戶端和連接創建了Service1
類的一個實例。
所有傳入呼叫僅使用一個
InstanceContext
對象,並且不會在呼叫之后回收。 如果服務對象不存在,則會創建一個。
您可能應該改為使用InstanceContextMode.PerSession
,並將字段更改為instance:
public class Service1 : IService1
{
private List<int> lst = new List<int>();
讓我們將WCF帶出圖片。 如果我有以下代碼,您期望輸出是什么。
public class Foo
{
private static int number = 0;
public int GetNumber()
{
number = number + 1;
return number;
}
}
public static Main()
{
var foo1 = new Foo();
Console.WriteLine(foo1.GetNumber());
Console.WriteLine(foo1.GetNumber());
var foo2 = new Foo();
Console.WriteLine(foo1.GetNumber());
}
您應該看到1, 2, 3
。
WCF不會修改static
的行為。 如果您有兩個類的實例,它仍然共享靜態變量。 InstanceContextMode
作用是控制執行new Foo()
頻率。
這是更多顯示差異的示例代碼。
public static Main()
{
Console.WriteLine("1- PerCall");
Console.WriteLine("2- Session");
Console.WriteLine("3- Single");
Console.Write("Choose: ");
var choice = Console.ReadLine();
switch(choice)
{
case "1":
PerCallExample();
PerCallExample();
break;
case "2":
PerSessionExample();
PerSessionExample();
break;
case "3":
var foo = Foo();
SingleExample(foo);
SingleExample(foo);
break;
}
}
void Call(Foo foo)
{
Console.WriteLine(foo.GetNumber());
}
void PerCallExample()
{
Foo foo;
foo = new Foo();
Call(Foo foo);
foo = new Foo();
Call(Foo foo);
}
void PerSessionExample()
{
Foo foo = new Foo();
Call(Foo foo);
Call(Foo foo);
}
void SingleExample(foo)
{
Call(Foo foo);
Call(Foo foo);
}
沒關系,您選擇的全部3種模式都會輸出1, 2, 3, 4
。 但是,如果您刪除static
的number
,你應該得到1, 1, 1, 1
,從PerCall
, 1, 2, 1, 2
用於Session
,和1, 2, 3, 4
為Single
。
現在將此應用到您的WCF。 由於List
是靜態的,因此它將在所有服務調用之間共享,直到下次重新啟動該服務為止,這就是為什么您的數據將保持不變的原因。 您需要將其更改為靜態列表而不是靜態列表的原因我不能不知道您想做的事情的更多信息(但是,將其更改為靜態並使其成為實例上下文Single
將具有與如上例所示,它是靜態的。因此,您也可能不想使用Single
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.