簡體   English   中英

雙工Wcf服務應用程序,列表保留上次運行的應用程序的值

[英]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枚舉

您可能應該改為使用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 但是,如果您刪除staticnumber ,你應該得到1, 1, 1, 1 ,從PerCall1, 2, 1, 2用於Session ,和1, 2, 3, 4Single

現在將此應用到您的WCF。 由於List是靜態的,因此它將在所有服務調用之間共享,直到下次重新啟動該服務為止,這就是為什么您的數據將保持不變的原因。 您需要將其更改為靜態列表而不是靜態列表的原因我不能不知道您想做的事情的更多信息(但是,將其更改為靜態並使其成為實例上下文Single將具有與如上例所示,它是靜態的。因此,您也可能不想使用Single 。)

暫無
暫無

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

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